def _get_delayed_substs(self): ret = [] prev = self.state for d in range(1, self.delay_amount + 1): ret.append(vtypes.Subst(self.delayed_state[d], prev)) prev = self.delayed_state[d] return ret
def visit_NonblockingSubstitution(self, node): left = self.visit(node.left) right = self.visit(node.right) ldelay = self.visit( node.ldelay.delay) if node.ldelay is not None else None rdelay = self.visit( node.rdelay.delay) if node.rdelay is not None else None return vtypes.Subst(left, right, blk=False, ldelay=ldelay, rdelay=rdelay)
def visit_Cat(self, node): left = [] right = [] for v in node.vars: val = self.visit(v) right = vtypes.IntX() if val is None else val.right left.append(v) right.append(right) return vtypes.Subst(vtypes.Cat(tuple(left)), vtypes.Cat(tuple(right)))
def visit_Slice(self, node): val = self.visit(node.var) if val is None: return None if isinstance(val.right, vtypes._Variable): right = vtypes.Slice(val.right, node.msb, node.lsb) else: right = vtypes.And(vtypes.Srl(val.right, node.lsb), vtypes.Repeat(vtypes.Int(1, width=1), node.msb - node.lsb + 1)) return vtypes.Subst(vtypes.Slice(val.left, node.msb, node.lsb), right)
def visit_Assign(self, node): left = self.visit(node.left) right = self.visit(node.right) ldelay = self.visit( node.ldelay.value) if node.ldelay is not None else None rdelay = self.visit( node.rdelay.value) if node.rdelay is not None else None subst = vtypes.Subst(left, right, ldelay=ldelay, rdelay=rdelay) assign = vtypes.Assign(subst) self.add_object(assign) return assign
def setBind(self, var, value, cond=None): if var is None: cond = None value = optimize(value) cond = optimize(cond) if cond is not None else None subst = (vtypes.SingleStatement(value) if var is None else vtypes.Subst(var, value)) self.fsm._add_statement([subst], cond=cond) state = self.getFsmCount() self.scope.addBind(state, var, value, cond)
def visit_Pointer(self, node): val = self.visit(node.var) if val is None: return None left = vtypes.Pointer(val.left, node.pos) if not isinstance(val.right, (vtypes._Variable, vtypes.Scope)): if isinstance(val.right, (int, bool)): val_right = vtypes.Int(val.right) elif isinstance(val.right, float): val_right = vtypes.Float(val.right) else: raise TypeError("unsupported value type: %s" % str(val.right)) right = (val_right >> node.pos) & 0x1 else: right = vtypes.Pointer(val.right, node.pos) return vtypes.Subst(left, right)
def setBind(self, var, value, cond=None): if var is None: cond = None value = optimize(value) cond = optimize(cond) if cond is not None else None subst = (vtypes.SingleStatement(value) if var is None else vtypes.Subst(var, value)) if var is not None: if hasattr(var, '_fsm') and id(var._fsm) != id(self.fsm): raise ValueError("variable '%s' has multiple drivers" % str(var)) if not hasattr(var, '_fsm'): var._fsm = self.fsm self.fsm._add_statement([subst], cond=cond) state = self.getFsmCount() self.scope.addBind(state, var, value, cond)
def visit_Cat(self, node): left_values = [] right_values = [] for v in node.vars: val = self.visit(v) width = v.bit_length() if width is None: width = 1 if val is None: right = vtypes.IntX(width) elif isinstance(val.right, int): right = vtypes.Int(val.right, width) elif isinstance(val.right, vtypes._Constant): right = copy.deepcopy(val.right) right.width = width else: right = v._get_module().TmpLocalparam(val.right, width) left_values.append(v) right_values.append(right) return vtypes.Subst(vtypes.Cat(*left_values), vtypes.Cat(*right_values))
def write(self, value): return vtypes.Subst(self, value)
def visit__Variable(self, node): if node.initval is None: return None return vtypes.Subst(node, node.initval)
def _init_delayed_state(self): ret = [] for d in range(1, self.delay_amount + 1): ret.append(vtypes.Subst(self.delayed_state[d], self._get_mark(0))) return ret
def visit_Subst(self, node): left = self.visit(node.left) right = node.right return vtypes.Subst(left, right)
def visit_Slice(self, node): val = self.visit(node.var) if val is None: return None return vtypes.Subst(vtypes.Slice(val.left, node.msb, node.lsb), vtypes.Slice(val.right, node.msb, node.lsb))
def subst(fsm, dst, src): statement(fsm, vtypes.Subst(dst, src))
def visit_Pointer(self, node): val = self.visit(node.var) if val is None: return None return vtypes.Subst(vtypes.Pointer(val.left, node.pos), vtypes.Pointer(val.right, node.pos))