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
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
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