Example #1
0
 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
Example #2
0
 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)
Example #3
0
 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)))
Example #4
0
 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)
Example #5
0
 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
Example #6
0
    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)
Example #7
0
 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)
Example #8
0
    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)
Example #9
0
    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))
Example #10
0
 def write(self, value):
     return vtypes.Subst(self, value)
Example #11
0
 def visit__Variable(self, node):
     if node.initval is None:
         return None
     return vtypes.Subst(node, node.initval)
Example #12
0
 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
Example #13
0
 def visit_Subst(self, node):
     left = self.visit(node.left)
     right = node.right
     return vtypes.Subst(left, right)
Example #14
0
 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))
Example #15
0
def subst(fsm, dst, src):
    statement(fsm, vtypes.Subst(dst, src))
Example #16
0
 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))