示例#1
0
 def as_hdl_HdlType_array(self, typ, declaration=False):
     if declaration:
         return super(ToHdlAstSimModel_types,
                      self).as_hdl_HdlType_array(typ,
                                                 declaration=declaration)
     else:
         t_name = self.name_scope.get_object_name(typ)
         return hdl_getattr(self.SELF, t_name)
示例#2
0
    def as_hdl_HEnumVal(self, val: HEnumVal):
        try:
            t_name = self.name_scope.get_object_name(val._dtype)
        except ObjectForNameNotFound:
            if self.debug:
                t_name = val._dtype.name
            else:
                raise

        if val.vld_mask:
            try:
                name = self.name_scope.get_object_name(val)
            except ObjectForNameNotFound:
                if self.debug:
                    name = val.val
                else:
                    raise

            return hdl_getattr(HdlValueId(t_name, obj=val._dtype), name)
        else:
            return hdl_call(hdl_getattr(HdlValueId(t_name, obj=val._dtype), "from_py"),
                            [None, ])
示例#3
0
文件: value.py 项目: klopstock/hwt
    def as_hdl_Operator(self, op: Operator):
        ops = op.operands
        o = op.operator

        if o == AllOps.EQ:
            op0 = self.as_hdl_Value(ops[0])
            op1 = self.as_hdl_Value(ops[1])
            return hdl_call(hdl_getattr(op0, "_eq"), [
                op1,
            ])
        elif o == AllOps.TERNARY:
            zero, one = BIT.from_py(0), BIT.from_py(1)
            if ops[1] == one and ops[2] == zero:
                # ignore redundant x ? 1 : 0
                return self.as_hdl_cond(ops[0], True)
            else:
                op0 = self.as_hdl_cond(ops[0], True)
                op1 = self.as_hdl_Value(ops[1])
                op2 = self.as_hdl_Value(ops[2])
                return hdl_call(hdl_getattr(op0, "_ternary"), [op1, op2])
        elif o == AllOps.RISING_EDGE or o == AllOps.FALLING_EDGE:
            if o == AllOps.RISING_EDGE:
                fn = "_onRisingEdge"
            else:
                fn = "_onFallingEdge"
            op0 = self.as_hdl_Value(ops[0])
            # pop .val
            op0 = op0.ops[0]
            return hdl_call(hdl_getattr(op0, fn), [])
        elif o in [
                AllOps.BitsAsUnsigned, AllOps.BitsAsVec, AllOps.BitsAsSigned
        ]:
            op0, = ops
            do_cast = bool(op0._dtype.signed) != bool(op.result._dtype.signed)

            op_hdl = self.as_hdl_Value(op0)
            if do_cast:
                if bool(op0._dtype.signed):
                    sign = self.TRUE
                else:
                    sign = self.FALSE
                    # cast_sign()
                return hdl_call(hdl_getattr(op_hdl, "cast_sign"), [
                    sign,
                ])
            else:
                return op_hdl
        elif o == AllOps.CONCAT:
            return hdl_call(hdl_getattr(self.as_hdl_Value(ops[0]), "_concat"),
                            [
                                self.as_hdl_Value(ops[1]),
                            ])
        elif o == AllOps.EQ:
            return hdl_call(hdl_getattr(self.as_hdl_Value(ops[0]), "_eq"), [
                self.as_hdl_Value(ops[1]),
            ])
        else:
            o = self.op_transl_dict[o]
            return HdlOp(o, [self.as_hdl_Value(o2) for o2 in ops])
 def visit_HdlStmAssign(self, o):
     """
     :type o: HdlStmAssign
     """
     assert o.event_delay is None, o
     assert o.time_delay is None, o
     is_clock_edge_dependent = self.is_clock_edge_dependent(o)
     dst, dst_index = self.pop_index_list(o.dst)
     o.dst = hdl_getattr(dst, "val_next")
     if dst_index:
         o.src = [o.src, dst_index, is_clock_edge_dependent]
     else:
         o.src = [o.src, is_clock_edge_dependent]
示例#5
0
    def visit_HdlOp(self, o):
        """
        :type o: HdlOp
        :return: iHdlExpr
        """
        if o.fn == HdlOpType.DOT:
            # update only left most name
            o.ops[0] = self.visit_iHdlExpr(o.ops[0])
            if not self._stm_dst:
                return hdl_getattr(o, "val")
        else:
            o.ops = [self.visit_iHdlExpr(op) for op in o.ops]

        return o
示例#6
0
 def as_hdl_SignalItem(self, si: SignalItem, declaration=False):
     if declaration:
         sigType = systemCTypeOfSig(si)
         with SignalTypeSwap(self, sigType):
             return ToHdlAst_Value.as_hdl_SignalItem(self, si, declaration=True)
     else:
         if si.hidden and si.origin is not None:
             return self.as_hdl(si.origin)
         else:
             sigType = systemCTypeOfSig(si)
             _si = HdlValueId(si.name, obj=si)
             if self._in_sensitivity_list or self._is_target or sigType is SIGNAL_TYPE.REG:
                 return _si
             else:
                 return hdl_call(hdl_getattr(_si, "read"), [])
示例#7
0
    def as_hdl_BitsVal(self, val: BitsVal):
        isFullVld = val._is_full_valid()
        if not self._valueWidthRequired:
            if isFullVld:
                return HdlValueInt(val.val, None, 16)
            elif val.vld_mask == 0:
                return self.NONE

        t = self.as_hdl_HdlType_bits(val._dtype, declaration=False)
        c = hdl_getattr(t, "from_py")
        args = [HdlValueInt(val.val, None, 16), ]
        if not isFullVld:
            args.append(HdlValueInt(val.vld_mask, None, 16))

        return hdl_call(c, args)
示例#8
0
    def _as_hdl_Assignment(self, dst, typeOfDst, src):

        orig_is_target = self._is_target
        try:
            self._is_target = True
            dst_hdl = self.as_hdl(dst)
        finally:
            self._is_target = orig_is_target

        src_hdl = self.as_hdl_Value(src)
        if typeOfDst == SIGNAL_TYPE.REG:
            return HdlStmAssign(src_hdl, dst_hdl)
        else:
            return hdl_call(hdl_getattr(dst_hdl, "write"), [
                src_hdl,
            ])
示例#9
0
 def visit_iHdlExpr(self, o):
     """
     :type o: iHdlExpr
     :return: iHdlExpr
     """
     if isinstance(o, HdlValueId):
         o = add_io_prefix(o)
         if not self._stm_dst:
             return hdl_getattr(o, "val")
         return o
     elif o is None or isinstance(o, HdlValueInt) or is_str(o):
         return o
     elif isinstance(o, list):
         return [self.visit_iHdlExpr(_o) for _o in o]
     elif isinstance(o, HdlOp):
         return self.visit_HdlOp(o)
     else:
         raise NotImplementedError("Do not know how to convert %s" % (o))
示例#10
0
class ToHdlAstSimModel_value(ToHdlAst_Value):
    Bits3val = HdlValueId("Bits3val", obj=Bits3val)
    Bits3t = HdlValueId("Bits3t", obj=Bits3t)
    SELF = HdlValueId("self", obj=LanguageKeyword())
    Array3val = HdlValueId("Array3val", obj=Array3val)
    SLICE = HdlValueId("slice", obj=slice)
    TRUE = HdlValueId("True", obj=True)
    FALSE = HdlValueId("False", obj=False)
    Bits3val = HdlValueId("Bits3val", obj=Bits3val)
    ABits3t = HdlValueId("Bits3t", obj=Bits3t)
    SELF_IO = hdl_getattr(HdlValueId("self", obj=LanguageKeyword()), "io")
    CONCAT = HdlValueId("Concat", obj=Concat)
    op_transl_dict = {
        **HWT_TO_HDLCONVEROTR_OPS,
        AllOps.INDEX: HdlOpType.INDEX,
    }
    _cast_ops = {
        AllOps.BitsAsSigned,
        AllOps.BitsAsUnsigned,
        AllOps.BitsAsVec,
    }

    def is_suitable_for_const_extract(self, val: HValue):
        return not isinstance(val._dtype, HEnum) or val.vld_mask == 0

    def as_hdl_SignalItem(self,
                          si: Union[SignalItem, HdlIdDef],
                          declaration=False):
        if not declaration and not si.hidden:
            if si._const:
                return hdl_getattr(self.SELF, si.name)
            else:
                return hdl_getattr(hdl_getattr(self.SELF_IO, si.name), "val")
        else:
            return super(ToHdlAstSimModel_value,
                         self).as_hdl_SignalItem(si, declaration=declaration)

    def as_hdl_BitsVal(self, val: BitsVal):
        dtype = val._dtype
        as_hdl_int = self.as_hdl_int
        t = hdl_call(self.Bits3t, [
            as_hdl_int(dtype.bit_length()),
            as_hdl_int(int(bool(dtype.signed)))
        ])
        return hdl_call(self.Bits3val,
                        [t, as_hdl_int(val.val),
                         as_hdl_int(val.vld_mask)])

    def as_hdl_DictVal(self, val):
        return {
            self.as_hdl_int(int(k)): self.as_hdl_Value(v)
            for k, v in val.items()
        }

    def as_hdl_HArrayVal(self, val):
        return hdl_call(self.Array3val, [
            self.as_hdl_HdlType(val._dtype),
            self.as_hdl_DictVal(val.val),
            self.as_hdl_int(val.vld_mask)
        ])

    def as_hdl_SliceVal(self, val):
        args = (val.val.start, val.val.stop, val.val.step)
        return hdl_call(self.SLICE, [self.as_hdl_int(int(a)) for a in args])

    def as_hdl_HEnumVal(self, val: HEnumVal):
        t_name = self.name_scope.get_object_name(val._dtype)
        if val.vld_mask:
            name = self.name_scope.get_object_name(val)
            return hdl_getattr(hdl_getattr(self.SELF, t_name), name)
        else:
            return hdl_call(
                hdl_getattr(hdl_getattr(self.SELF, t_name), "from_py"), [
                    None,
                ])

    def as_hdl_Operator(self, op: Operator):
        ops = op.operands
        o = op.operator

        if o == AllOps.EQ:
            op0 = self.as_hdl_Value(ops[0])
            op1 = self.as_hdl_Value(ops[1])
            return hdl_call(hdl_getattr(op0, "_eq"), [
                op1,
            ])
        elif o == AllOps.TERNARY:
            if ops[1] == one and ops[2] == zero:
                # ignore redundant x ? 1 : 0
                return self.as_hdl_cond(ops[0], True)
            else:
                op0 = self.as_hdl_cond(ops[0], True)
                op1 = self.as_hdl_Value(ops[1])
                op2 = self.as_hdl_Value(ops[2])
                return hdl_call(hdl_getattr(op0, "_ternary"), [op1, op2])
        elif o == AllOps.RISING_EDGE or o == AllOps.FALLING_EDGE:
            if o == AllOps.RISING_EDGE:
                fn = "_onRisingEdge"
            else:
                fn = "_onFallingEdge"
            op0 = self.as_hdl_Value(ops[0])
            # pop .val
            op0 = op0.ops[0]
            return hdl_call(hdl_getattr(op0, fn), [])
        elif o in self._cast_ops:
            op0, = ops
            do_cast = bool(op0._dtype.signed) != bool(op.result._dtype.signed)

            op_hdl = self.as_hdl_Value(op0)
            if do_cast:
                if bool(op.result._dtype.signed):
                    sign = self.TRUE
                else:
                    sign = self.FALSE
                return hdl_call(hdl_getattr(op_hdl, "cast_sign"), [
                    sign,
                ])
            else:
                return op_hdl
        elif o == AllOps.CONCAT:
            return hdl_call(hdl_getattr(self.as_hdl_Value(ops[0]), "_concat"),
                            [
                                self.as_hdl_Value(ops[1]),
                            ])
        elif o == AllOps.EQ:
            return hdl_call(hdl_getattr(self.as_hdl_Value(ops[0]), "_eq"), [
                self.as_hdl_Value(ops[1]),
            ])
        else:
            o = self.op_transl_dict[o]
            return HdlOp(o, [self.as_hdl_Value(o2) for o2 in ops])
示例#11
0
def add_io_prefix(o):
    s = HdlValueId("self")
    s = hdl_getattr(s, "io")
    return hdl_name_prefix(s, o)