Source code for hdlConvertorAst.translate.common.discover_declarations

from itertools import chain

from hdlConvertorAst.hdlAst import iHdlStatement, HdlIdDef, \
    HdlModuleDec, HdlModuleDef, HdlCompInst, HdlFunctionDef
from hdlConvertorAst.to.hdl_ast_visitor import HdlAstVisitor
from hdlConvertorAst.translate.common.name_scope import WithNameScope


[docs]class BuiltIn(object):
[docs] def __init__(self, name): self.name = name
def __repr__(self): return "<%s %s>" % (self.__class__.__name__, self.name)
[docs]class DiscoverDeclarations(HdlAstVisitor):
[docs] def __init__(self, name_scope): """ :type name_scope: NameScope """ super(DiscoverDeclarations, self).__init__() self.name_scope = name_scope
[docs] def visit_HdlIdDef(self, o): """ :type name_scope: NameScope :type o: HdlIdDef """ self.name_scope.register_name(o.name, o)
[docs] def visit_HdlModuleDec(self, o): """ :type name_scope: NameScope :type o: HdlModuleDec """ ns = self.name_scope ns.register_name(o.name, o) with WithNameScope(self, ns.level_push(o.name)): for p in chain(o.params, o.ports): self.visit_HdlIdDef(p) for o2 in o.objs: raise NotImplementedError(o2)
[docs] def visit_HdlModuleDef(self, o): """ :type o: HdlModuleDef """ if o.dec is not None: self.visit_HdlModuleDec(o.dec) with WithNameScope(self, self.name_scope.get_child(o.module_name.val)): self.discover_declarations(o.objs)
[docs] def visit_HdlCompInst(self, o): """ :type o: HdlCompInst """ if o.name is not None: self.name_scope.register_name(o.name, o)
# name_scope = name_scope.get_object_by_name(o.module_name)
[docs] def visit_HdlFunctionDef(self, o): """ :type o: HdlFunctionDef """ ns = self.name_scope ns.register_name(o.name, o) with WithNameScope(self, ns.level_push(o.name)): self.discover_declarations(o.params) self.discover_declarations(o.body) return o
[docs] def _discover_declarations(self, o): if isinstance(o, HdlIdDef): self.visit_HdlIdDef(o) elif isinstance(o, HdlModuleDec): self.visit_HdlModuleDec(o) elif isinstance(o, HdlModuleDef): self.visit_HdlModuleDef(o) elif isinstance(o, iHdlStatement): pass elif isinstance(o, HdlCompInst): self.visit_HdlCompInst(o) elif isinstance(o, HdlFunctionDef): self.visit_HdlFunctionDef(o) else: raise NotImplementedError(o)
[docs] def discover_declarations(self, objs): for o in objs: self._discover_declarations(o)