Beispiel #1
0
    def _operand(cls, operand: Union[RtlSignal, Value], operator: OpDefinition,
                 ctx: SerializerCtx):
        try:
            isTernaryOp = operand.hidden and operand.drivers[
                0].operator == AllOps.TERNARY
        except (AttributeError, IndexError):
            isTernaryOp = False

        if isTernaryOp:
            # rewrite ternary operator as if
            o = ctx.createTmpVarFn("tmpTernary", operand._dtype)
            cond, ifTrue, ifFalse = operand.drivers[0].operands
            if_ = If(cond)
            if_.ifTrue.append(
                Assignment(ifTrue, o, virtualOnly=True, parentStm=if_))
            if_.ifFalse = []
            if_.ifFalse.append(
                Assignment(ifFalse, o, virtualOnly=True, parentStm=if_))
            if_._outputs.append(o)
            for obj in (cond, ifTrue, ifFalse):
                if isinstance(obj, RtlSignalBase):
                    if_._inputs.append(obj)
            o.drivers.append(if_)
            operand = o

        s = cls.asHdl(operand, ctx)
        if isinstance(operand, RtlSignalBase):
            try:
                o = operand.singleDriver()
                if o.operator != operator and\
                        cls.opPrecedence[o.operator] <= cls.opPrecedence[operator]:
                    return "(%s)" % s
            except Exception:
                pass
        return s
Beispiel #2
0
 def _as_Bits(self, val: Union[RtlSignal, Value]):
     if val._dtype == BOOL:
         bit1_t = Bits(1)
         o = self.createTmpVarFn("tmpBool2std_logic_", bit1_t)
         ifTrue, ifFalse = bit1_t.from_py(1), bit1_t.from_py(0)
         if_ = If(val)
         if_.ifTrue.append(Assignment(ifTrue, o, virtual_only=True, parentStm=if_))
         if_.ifFalse = []
         if_.ifFalse.append(Assignment(ifFalse, o, virtual_only=True, parentStm=if_))
         if_._outputs.append(o)
         o.drivers.append(if_)
         return o
     else:
         assert isinstance(val._dtype, Bits), val._dtype
         return val
Beispiel #3
0
 def _tmp_var_for_ternary(self, val: RtlSignal):
     """
     Optionaly convert boolean to std_logic_vector
     """
     o = self.createTmpVarFn("tmpTernary_", val._dtype)
     cond, ifTrue, ifFalse = val.drivers[0].operands
     if_ = If(cond)
     if_.ifTrue.append(
         Assignment(ifTrue, o, virtual_only=True, parentStm=if_))
     if_.ifFalse = []
     if_.ifFalse.append(
         Assignment(ifFalse, o, virtual_only=True, parentStm=if_))
     if_._outputs.append(o)
     for obj in (cond, ifTrue, ifFalse):
         if isinstance(obj, RtlSignalBase):
             if_._inputs.append(obj)
     o.drivers.append(if_)
     return o