port_decl
[sv2nmigen.git] / absyn.py
1 from lib2to3.pytree import Node, Leaf
2 from lib2to3.pgen2 import token
3 from lib2to3.pygram import python_symbols as syms
4
5 preamble = """# this file has been generated by sv2nmigen
6
7 from nmigen import Signal, Module, Const, Cat, Elaboratable
8
9
10
11 """
12
13 indent_debug = 0
14
15 class Absyn:
16 def __init__(self):
17 self.outputfile = open("output.py","w")
18 self.outputfile.write(preamble)
19 self.assign = []
20 def printpy(self,p):
21 self.outputfile.write(str(p)+"\n")
22 def assign(self,p):
23 p = list(p)
24 if(p[1]=="assign"):
25 self.printpy(p[4])
26 # m.d.comb += [l.eq(r)]
27 def indent(self,count):
28 if(indent_debug):
29 return Leaf(token.INDENT, '>>> '*count)
30 else:
31 return Leaf(token.INDENT, ' '*4*count)
32
33 def dedent(self,count):
34 return Leaf(token.DEDENT, '')
35 def nl(self):
36 return Leaf(token.NEWLINE, '\n')
37
38 def port_decl(self,comment, dt, name):
39 return None # TODO
40
41 def initPorts(self,params,ports):
42 pass_stmt = Node(syms.pass_stmt ,[Leaf(token.NAME, "def __init__(self):#FIXME")])
43 if params:
44 params = [Leaf(token.LPAR, '(')] + params + [Leaf(token.RPAR, ')')]
45 fn = [Leaf(token.NAME, 'def'),
46 Leaf(token.NAME, '__initXXX__', prefix=' '),
47 Node(syms.parameters, params),
48 Leaf(token.COLON, ':')]
49 fndef = Node(syms.funcdef, fn)
50 stmts = Node(syms.stmt, [fndef])
51 else:
52 stmts = Node(syms.small_stmt, [pass_stmt, Leaf(token.NEWLINE, '\n')])
53 stmts = Node(syms.stmt, [stmts])
54
55 for port in ports:
56 stmts.children.append(self.indent(2))
57 stmts.children.append(port)
58 stmts.children.append(self.nl())
59
60 return stmts
61
62 def initFunc(self,ports,params):
63 params = [Leaf(token.LPAR, '('),Leaf(token.NAME,"self")] + [Leaf(token.RPAR, ')')]
64 # TODO handle sv params
65 fn = [Leaf(token.NAME, 'def'),
66 Leaf(token.NAME, '__init__', prefix=' '),
67 Node(syms.parameters, params),
68 Leaf(token.COLON, ':'),
69 self.nl()
70 ]
71 fndef = Node(syms.funcdef, fn)
72 stmts = Node(syms.stmt, [fndef])
73 for port in ports:
74 stmts.children.append(self.indent(2))
75 stmts.children.append(port)
76 stmts.children.append(self.nl())
77 return stmts
78
79 def elaborateFunc(self):
80 params = [Leaf(token.LPAR, '('),Leaf(token.NAME,"self, platform=None"),Leaf(token.RPAR, ')')]
81 fn = [Leaf(token.NAME, 'def'),
82 Leaf(token.NAME, 'elaborate', prefix=' '),
83 Node(syms.parameters, params),
84 Leaf(token.COLON, ':'),
85 self.nl()
86 ]
87 fndef = Node(syms.funcdef, fn)
88 stmts = Node(syms.stmt, [fndef])
89 stmts.children.append(self.indent(2))
90 stmts.children.append(Leaf(token.STRING,"m = Module()"))
91 stmts.children.append(self.nl())
92 ##
93 for a in self.assign:
94 stmts.children.append(self.indent(2))
95 stmts.children.append(Leaf(token.STRING,"#FIXME_ASSIGN"+str(list(a[8]))))
96 stmts.children.append(self.nl())
97
98 stmts.children.append(self.indent(2))
99 stmts.children.append(Leaf(token.STRING,"return m"))
100 stmts.children.append(self.nl())
101 return stmts
102
103 def module_1(self,p):
104 params = p[7]
105 ports = p[8]
106 clsname = [Leaf(token.NAME, 'class'),
107 Leaf(token.NAME, p[4], prefix=' '),
108 Leaf(token.LPAR,'('),
109 Leaf(token.NAME, 'Elaboratable'),
110 Leaf(token.LPAR,')'),
111 Leaf(token.COLON, ':'),
112 self.nl(),
113 ]
114
115 suite = Node(syms.suite, [Leaf(token.NEWLINE, '\n'),
116 self.indent(1),
117 self.initFunc(ports,params),
118 self.indent(1),
119 self.elaborateFunc()
120
121 ])
122 clsdecl = Node(syms.classdef, clsname + [suite])
123 clsdecl = Node(syms.compound_stmt, [clsdecl])
124
125 self.printpy(str(clsdecl))
126 return clsdecl
127
128 # combinatorical assign
129 def cont_assign_1(self,p):
130 #self.printpy("#ASSIGN"+str(list(p)))
131 self.assign += [p]