Source code for hdlConvertorAst.to.hdl_ast_modifier

from hdlConvertorAst.hdlAst import HdlImport, HdlStmProcess, HdlStmIf,\
    HdlStmAssign, HdlStmCase, HdlStmWait, HdlStmReturn, HdlStmFor, HdlStmForIn,\
    HdlStmWhile, HdlStmBlock, iHdlStatement, HdlModuleDec, HdlModuleDef,\
    HdlValueIdspace, HdlIdDef, HdlFunctionDef, HdlOp, HdlCompInst, \
    HdlValueInt, HdlStmBreak, HdlStmContinue, HdlStmRepeat, HdlLibrary, HdlContext,\
    HdlClassDef, HdlPhysicalDef, HdlEnumDef
from hdlConvertorAst.to.hdl_ast_visitor import HdlAstVisitor


[docs]class HdlAstModifier(HdlAstVisitor): """ A visitor which can be used to traverse and modyfy AST (Abstract Syntax Tree) made of objects from `hdlConvertorAst.hdlAst` module. Each visit function has to return the object which replaces current object It should return the same object if no change is required. """
[docs] def visit_iHdlObj_list(self, obj_list, visit_fn): """ :ivar obj_list: list of HDL objects :ivar visit_fn: function to modidify the object """ for i, o in enumerate(obj_list): obj_list[i] = visit_fn(o) return obj_list
[docs] def visit_HdlContext(self, context): """ :type context: HdlContext """ self.visit_iHdlObj_list(context.objs, self.visit_main_obj) return context
[docs] def visit_HdlValueIdspace(self, o): """ :type o: HdlValueIdspace """ self.visit_doc(o) self.visit_iHdlObj_list(o.objs, self.visit_iHdlObj) return o
[docs] def visit_HdlModuleDec(self, o): """ :type o: HdlModuleDec """ self.visit_doc(o) self.visit_iHdlObj_list(o.params, self.visit_param) self.visit_iHdlObj_list(o.ports, self.visit_port) self.visit_iHdlObj_list(o.objs, self.visit_main_obj) return o
[docs] def visit_HdlIdDef(self, o): """ :type o: HdlIdDef """ self.visit_doc(o) o.type = self.visit_type(o.type) if o.value is not None: o.value = self.visit_iHdlExpr(o.value) return o
[docs] def visit_iHdlExpr(self, o): """ :type o: iHdlExpr :return: iHdlExpr """ if isinstance(o, HdlOp): return self.visit_HdlOp(o) else: return o
[docs] def visit_HdlOp(self, o): """ :type o: HdlOp :return: iHdlExpr """ self.visit_iHdlObj_list(o.ops, self.visit_iHdlExpr) return o
[docs] def visit_HdlValueInt(self, o): """ :type o: HdlValueInt """ return o
[docs] def visit_port(self, o): return self.visit_HdlIdDef(o)
[docs] def visit_param(self, o): return self.visit_HdlIdDef(o)
[docs] def visit_HdlModuleDef(self, o): """ :type o: HdlModuleDef """ if o.dec is not None: o.dec = self.visit_HdlModuleDec(o.dec) self.visit_doc(o) objs = o.objs for i, _o in enumerate(objs): if isinstance(_o, iHdlStatement): _o = self.visit_iHdlStatement(_o) elif isinstance(_o, HdlIdDef): _o = self.visit_HdlIdDef(_o) elif isinstance(_o, HdlCompInst): _o = self.visit_HdlCompInst(_o) elif isinstance(_o, HdlFunctionDef): _o = self.visit_HdlFunctionDef(_o) else: raise NotImplementedError(_o) objs[i] = _o return o
[docs] def visit_HdlCompInst(self, o): """ :type o: HdlCompInst """ self.visit_doc(o) self.visit_iHdlObj_list(o.param_map, self.visit_iHdlExpr) self.visit_iHdlObj_list(o.port_map, self.visit_iHdlExpr) return o
[docs] def visit_HdlClassDef(self, o): """ :type o: HdlClassDef """ self.visit_doc(o) self.visit_iHdlObj_list(o.base_types, self.visit_iHdlExpr) self.visit_iHdlObj_list(o.members, self.visit_iHdlObj) return o
[docs] def visit_HdlPhysicalDef(self, o): """ :type o: HdlPhysicalDef """ return o
[docs] def visit_HdlEnumDef(self, o): """ :type o: HdlEnumDef """ return o
[docs] def visit_HdlFunctionDef(self, o): """ :type o: HdlFunctionDef """ self.visit_doc(o) self.visit_iHdlObj_list(o.params, self.visit_HdlIdDef) if o.return_t is not None: o.return_t = self.visit_iHdlExpr(o.return_t) self.visit_iHdlObj_list(o.body, self.visit_main_obj) return o
[docs] def visit_HdlStmProcess(self, o): """ :type o: HdlStmProcess """ self.visit_doc(o) o.body = self.visit_iHdlStatement(o.body) return o
[docs] def visit_HdlStmBlock(self, o): """ :type o: HdlStmBlock """ self.visit_doc(o) self.visit_iHdlObj_list(o.body, self.visit_iHdlStatement) return o
[docs] def visit_HdlStmCase(self, o): """ :type o: HdlStmCase """ self.visit_doc(o) o.switch_on = self.visit_iHdlExpr(o.switch_on) cases = o.cases for i, (c, stm) in enumerate(cases): new_c = self.visit_iHdlExpr(c) new_stm = self.visit_iHdlStatement(stm) cases[i] = (new_c, new_stm) if o.default is not None: o.default = self.visit_iHdlStatement(o.default) return o
[docs] def visit_HdlStmWait(self, o): """ :type o: HdlStmWait """ self.visit_doc(o) o.val = self.visit_iHdlExpr(o.val) return o
[docs] def visit_HdlStmIf(self, o): """ :type o: HdlStmIf """ self.visit_doc(o) o.cond = self.visit_iHdlExpr(o.cond) if o.if_true is not None: o.if_true = self.visit_iHdlStatement(o.if_true) for i, (c, stm) in enumerate(o.elifs): new_c = self.visit_iHdlExpr(c) new_stm = self.visit_iHdlStatement(stm) o.elifs[i] = (new_c, new_stm) if o.if_false is not None: o.if_false = self.visit_iHdlStatement(o.if_false) return o
[docs] def visit_HdlStmFor(self, o): """ :type o: HdlStmFor """ self.visit_doc(o) o.init = self.visit_iHdlStatement(o.init) o.cond = self.visit_iHdlExpr(o.cond) o.step = self.visit_iHdlStatement(o.step) o.body = self.visit_iHdlStatement(o.body) return o
[docs] def visit_HdlStmForIn(self, o): """ :type o: HdlStmForIn """ self.visit_doc(o) self.visit_iHdlObj_list(o.var_defs, self.visit_main_obj) o.collection = self.visit_iHdlExpr(o.collection) o.body = self.visit_iHdlStatement(o.body) return o
[docs] def visit_HdlStmWhile(self, o): """ :type o: HdlStmWhile """ self.visit_doc(o) o.cond = self.visit_iHdlExpr(o.cond) o.body = self.visit_iHdlStatement(o.body) return o
[docs] def visit_HdlStmRepeat(self, o): """ :type o: HdlStmRepeat """ self.visit_doc(o) o.n = self.visit_iHdlExpr(o.n) o.body = self.visit_iHdlStatement(o.body) return o
[docs] def visit_HdlStmReturn(self, o): """ :type o: HdlStmReturn """ self.visit_doc(o) if o.val is not None: o.val = self.visit_iHdlExpr(o.val) return o
[docs] def visit_HdlStmAssign(self, o): """ :type o: HdlStmAssign """ self.visit_doc(o) o.src = self.visit_iHdlExpr(o.src) o.dst = self.visit_iHdlExpr(o.dst) if o.event_delay is not None: o.event_delay = self.visit_iHdlExpr(o.event_delay) if o.time_delay is not None: o.time_delay = self.visit_iHdlExpr(o.time_delay) return o