X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=absyn.py;h=12f1c0a2a46265994e874508337dfded4671d882;hb=ef7e6ced2fbede9970934dfc86140ab241f1a32d;hp=c59f8b6dc559fc6c04f626ccf80702c9da8615ba;hpb=1a995ea028ff7f563f1d453f7736bd548120b604;p=sv2nmigen.git diff --git a/absyn.py b/absyn.py index c59f8b6..12f1c0a 100644 --- a/absyn.py +++ b/absyn.py @@ -1,5 +1,131 @@ +from lib2to3.pytree import Node, Leaf +from lib2to3.pgen2 import token +from lib2to3.pygram import python_symbols as syms + +preamble = """# this file has been generated by sv2nmigen + +from nmigen import Signal, Module, Const, Cat, Elaboratable + + + +""" + +indent_debug = 0 + class Absyn: def __init__(self): self.outputfile = open("output.py","w") + self.outputfile.write(preamble) + self.assign = [] def printpy(self,p): self.outputfile.write(str(p)+"\n") + def assign(self,p): + p = list(p) + if(p[1]=="assign"): + self.printpy(p[4]) + # m.d.comb += [l.eq(r)] + def indent(self,count): + if(indent_debug): + return Leaf(token.INDENT, '>>> '*count) + else: + return Leaf(token.INDENT, ' '*4*count) + + def dedent(self,count): + return Leaf(token.DEDENT, '') + def nl(self): + return Leaf(token.NEWLINE, '\n') + + def port_decl(self,comment, dt, name): + return None # TODO + + def initPorts(self,params,ports): + pass_stmt = Node(syms.pass_stmt ,[Leaf(token.NAME, "def __init__(self):#FIXME")]) + if params: + params = [Leaf(token.LPAR, '(')] + params + [Leaf(token.RPAR, ')')] + fn = [Leaf(token.NAME, 'def'), + Leaf(token.NAME, '__initXXX__', prefix=' '), + Node(syms.parameters, params), + Leaf(token.COLON, ':')] + fndef = Node(syms.funcdef, fn) + stmts = Node(syms.stmt, [fndef]) + else: + stmts = Node(syms.small_stmt, [pass_stmt, Leaf(token.NEWLINE, '\n')]) + stmts = Node(syms.stmt, [stmts]) + + for port in ports: + stmts.children.append(self.indent(2)) + stmts.children.append(port) + stmts.children.append(self.nl()) + + return stmts + + def initFunc(self,ports,params): + params = [Leaf(token.LPAR, '('),Leaf(token.NAME,"self")] + [Leaf(token.RPAR, ')')] + # TODO handle sv params + fn = [Leaf(token.NAME, 'def'), + Leaf(token.NAME, '__init__', prefix=' '), + Node(syms.parameters, params), + Leaf(token.COLON, ':'), + self.nl() + ] + fndef = Node(syms.funcdef, fn) + stmts = Node(syms.stmt, [fndef]) + for port in ports: + stmts.children.append(self.indent(2)) + stmts.children.append(port) + stmts.children.append(self.nl()) + return stmts + + def elaborateFunc(self): + params = [Leaf(token.LPAR, '('),Leaf(token.NAME,"self, platform=None"),Leaf(token.RPAR, ')')] + fn = [Leaf(token.NAME, 'def'), + Leaf(token.NAME, 'elaborate', prefix=' '), + Node(syms.parameters, params), + Leaf(token.COLON, ':'), + self.nl() + ] + fndef = Node(syms.funcdef, fn) + stmts = Node(syms.stmt, [fndef]) + stmts.children.append(self.indent(2)) + stmts.children.append(Leaf(token.STRING,"m = Module()")) + stmts.children.append(self.nl()) + ## + for a in self.assign: + stmts.children.append(self.indent(2)) + stmts.children.append(Leaf(token.STRING,"#FIXME_ASSIGN"+str(list(a[8])))) + stmts.children.append(self.nl()) + + stmts.children.append(self.indent(2)) + stmts.children.append(Leaf(token.STRING,"return m")) + stmts.children.append(self.nl()) + return stmts + + def module_1(self,p): + params = p[7] + ports = p[8] + clsname = [Leaf(token.NAME, 'class'), + Leaf(token.NAME, p[4], prefix=' '), + Leaf(token.LPAR,'('), + Leaf(token.NAME, 'Elaboratable'), + Leaf(token.LPAR,')'), + Leaf(token.COLON, ':'), + self.nl(), + ] + + suite = Node(syms.suite, [Leaf(token.NEWLINE, '\n'), + self.indent(1), + self.initFunc(ports,params), + self.indent(1), + self.elaborateFunc() + + ]) + clsdecl = Node(syms.classdef, clsname + [suite]) + clsdecl = Node(syms.compound_stmt, [clsdecl]) + + self.printpy(str(clsdecl)) + return clsdecl + + # combinatorical assign + def cont_assign_1(self,p): + #self.printpy("#ASSIGN"+str(list(p))) + self.assign += [p]