def generate(self, signalname, identical=False, walk=True, step=1, reorder=False, delay=False): termname = util.toTermname(signalname) tree = self.treewalker.getTree(termname) if tree is None: raise verror.DefinitionError('No such signals: %s' % str(signalname)) if walk: tree = self.treewalker.walkTree(tree, visited=set(), step=step, delay=delay) if reorder: tree = reorder.reorder(tree) tree = self.optimizer.optimize(tree) if reorder: tree = reorder.reorder(tree) tree = replace.replaceUndefined(tree, termname) name = self.rename(signalname) self.identical = identical self.add_node(name, label=signalname) self.visit(tree, name)
def makeTree(self, termname): tree = self.getTree(termname) tree = self.treewalker.walkTree(tree) tree = reorder.reorder(tree) tree = self.optimizer.optimize(tree) tree = replace.replaceUndefined(tree, termname) return tree
def splitBind(self, bind, splitpos): tree = bind.tree msb = self.optimizer.optimizeConstant(bind.msb) lsb = self.optimizer.optimizeConstant(bind.lsb) ptr = self.optimizer.optimizeConstant(bind.ptr) if ptr is not None and msb is None or lsb is None: termtype = self.getTermtype(bind.dest) if signaltype.isRegArray(termtype) or signaltype.isWireArray( termtype): msb = self.optimizer.optimizeConstant(copy.deepcopy(term.msb)) lsb = self.optimizer.optimizeConstant(copy.deepcopy(term.lsb)) else: msb = copy.deepcopy(ptr) lsb = copy.deepcopy(ptr) if ptr is None and msb is None or lsb is None: term = self.getTerm(bind.dest) msb = self.optimizer.optimizeConstant(copy.deepcopy(term.msb)) lsb = self.optimizer.optimizeConstant(copy.deepcopy(term.lsb)) if splitpos > lsb.value and splitpos <= msb.value: # split right_lsb = lsb.value right_msb = splitpos - 1 right_width = splitpos - lsb.value left_lsb = splitpos left_msb = msb.value left_width = msb.value - splitpos + 1 right_tree = reorder.reorder( DFPartselect(copy.deepcopy(tree), DFEvalValue(right_width - 1), DFEvalValue(0))) left_tree = reorder.reorder( DFPartselect(copy.deepcopy(tree), DFEvalValue(msb.value), DFEvalValue(msb.value - left_width + 1))) right_tree = self.optimizer.optimize(right_tree) left_tree = self.optimizer.optimize(left_tree) left_bind = copy.deepcopy(bind) left_bind.tree = left_tree left_bind.msb = DFEvalValue(left_msb) left_bind.lsb = DFEvalValue(left_lsb) right_bind = copy.deepcopy(bind) right_bind.tree = right_tree right_bind.msb = DFEvalValue(right_msb) right_bind.lsb = DFEvalValue(right_lsb) return left_bind, right_bind return bind, None
def splitBind(self, bind, splitpos): tree = bind.tree msb = self.optimizer.optimizeConstant(bind.msb) lsb = self.optimizer.optimizeConstant(bind.lsb) ptr = self.optimizer.optimizeConstant(bind.ptr) if ptr is not None and msb is None or lsb is None: termtype = self.getTermtype(bind.dest) if signaltype.isRegArray(termtype) or signaltype.isWireArray(termtype): msb = self.optimizer.optimizeConstant(copy.deepcopy(term.msb)) lsb = self.optimizer.optimizeConstant(copy.deepcopy(term.lsb)) else: msb = copy.deepcopy(ptr) lsb = copy.deepcopy(ptr) if ptr is None and msb is None or lsb is None: term = self.getTerm(bind.dest) msb = self.optimizer.optimizeConstant(copy.deepcopy(term.msb)) lsb = self.optimizer.optimizeConstant(copy.deepcopy(term.lsb)) if splitpos > lsb.value and splitpos <= msb.value: # split right_lsb = lsb.value right_msb = splitpos - 1 right_width = splitpos - lsb.value left_lsb = splitpos left_msb = msb.value left_width = msb.value - splitpos + 1 right_tree = reorder.reorder(DFPartselect(copy.deepcopy(tree), DFEvalValue(right_width-1), DFEvalValue(0))) left_tree = reorder.reorder(DFPartselect(copy.deepcopy(tree), DFEvalValue(msb.value), DFEvalValue(msb.value-left_width+1))) right_tree = self.optimizer.optimize(right_tree) left_tree = self.optimizer.optimize(left_tree) left_bind = copy.deepcopy(bind) left_bind.tree = left_tree left_bind.msb = DFEvalValue(left_msb) left_bind.lsb = DFEvalValue(left_lsb) right_bind = copy.deepcopy(bind) right_bind.tree = right_tree right_bind.msb = DFEvalValue(right_msb) right_bind.lsb = DFEvalValue(right_lsb) return left_bind, right_bind return bind, None