Ejemplo n.º 1
0
    def mapToIR(self, ctx: EmitterContext):
        ref = get_attr(self, "ref")
        name = get_attr(self, "name")
        n = ctx.getRef(ref)

        typ = next(f.typ for f in n.typ.fields if f.name == name)
        f = low_ir.SubField(n, name, typ)
        ctx.updateRef(self, f)
        return f
Ejemplo n.º 2
0
    def __getattribute__(self, item):
        res = get_attr(self, "getAttr")(item)
        if res is not None:
            return res

        pred, bd = get_attr(self, "provideBundle")()

        if pred:
            from pyhcl.core._repr import SubField
            sf: SubField = getattr(bd, item)
            sf.ref = self
            return sf
        else:
            return None
Ejemplo n.º 3
0
 def provideBundle(self):
     from pyhcl.dsl.bundle import Bundle
     typ = get_attr(self, "typ")
     if isinstance(typ, Bundle):
         return True, typ
     else:
         return False, None
Ejemplo n.º 4
0
 def reverse(self):
     from pyhcl.core._repr import ReverseView
     isVec, typ = get_attr(self, "provideVector")()
     if isVec:
         return ReverseView(self, typ)
     else:
         raise Exception(f"${self} is not vector type")
Ejemplo n.º 5
0
    def __getattribute__(self, item):
        res = get_attr(self, "getAttr")(item)
        if res is not None:
            return res

        pred, bd = get_attr(self, "provideBundle")()

        if pred:
            import types
            from pyhcl.core._repr import SubField
            sf = getattr(bd, item)
            if type(sf) == types.MethodType:
                return types.MethodType(sf.__func__, self)
            sf.ref = self
            return sf
        else:
            return None
Ejemplo n.º 6
0
    def __post_init__(self):
        if self.size <= 0:
            raise Exception("can not declare an empty vector")

        if get_attr(self.typ, "lvl") is not None:
            self.lvl = self.typ.lvl + 1
        else:
            self.lvl = 1
Ejemplo n.º 7
0
    def __getattribute__(self, item):
        res = get_attr(self, item)
        if res is not None:
            return res

        value = get_attr(self, "value")
        obj = getattr(value, item)

        whiteList = {"typ", "lvl", "scopeId"}

        if item in whiteList:
            return obj
        elif isinstance(obj, SubField):
            obj.ref = self
            return obj
        else:
            return SubField(obj, item, self)
Ejemplo n.º 8
0
 def __getattribute__(self, item):
     res = get_attr(self, item)
     if res is not None:
         return res
     attr = getattr(self.typ, item)
     whiteList = ["width"]
     if item in whiteList:
         return attr
     return SubField(attr.value, item, self)
Ejemplo n.º 9
0
    def __call__(cls, *args, **kwargs):
        # unwrap
        func = lambda x: get_attr(x, 'value') if isinstance(x, Pub) else x

        nArgs = [func(i) for i in args]
        nKwargs = {k: func(v) for k, v in kwargs.items()}
        obj = type.__call__(cls, *nArgs, **nKwargs)

        # rewrap
        return Pub(obj)
Ejemplo n.º 10
0
 def flatten(self):
     from pyhcl.dsl.vector import Vec
     from pyhcl.core._repr import FlattenView
     isVec, typ = get_attr(self, "provideVector")()
     if isVec:
         l0v = typ
         l1v = typ.typ
         vt = Vec(l0v.size * l1v.size, l1v.typ)
         return FlattenView(self, vt, l0v.size, l1v.size)
     else:
         raise Exception(f"${self} is not vector type")
Ejemplo n.º 11
0
    def __getattribute__(self, item):
        res = get_attr(self, item)
        if res is not None:
            return res

        value = get_attr(self, "value")
        obj = getattr(value, item)

        whiteList = {"typ", "lvl", "scopeId", "width"}
        import types

        if item in whiteList:
            return obj
        elif isinstance(obj, SubField):
            obj.ref = self
            return obj
        elif type(obj) == types.MethodType:
            return types.MethodType(obj.__func__, self)
        else:
            return SubField(obj, item, self)
Ejemplo n.º 12
0
    def __init__(self, lst: Union[Generator, list]):
        super().__post_init__()
        lst = list(lst)

        if len(lst) <= 0:
            raise Exception("can not declare an empty vector")

        self.lst = lst
        self.typ = Vec(len(self.lst), self.lst[0].typ)
        lvl = get_attr(self.lst[0], "lvl")
        self.lvl = 1 + (lvl if lvl is not None else 0)
        self.typ.lvl = self.lvl
Ejemplo n.º 13
0
    def indexTransform(self, index):
        from pyhcl.dsl.cdatatype import U
        if isinstance(index, int):
            idx = self.typ.size - index - 1
        else:
            idx = U(self.typ.size - 1) - index

        tf = get_attr(self.ref, "indexTransform")
        if tf is not None:
            newIndex = tf(idx)
        else:
            newIndex = Index(self.ref, idx)

        return newIndex
Ejemplo n.º 14
0
    def indexTransform(self, index):
        from pyhcl.dsl.cdatatype import U
        if isinstance(index, int):
            l0i = index // self.l1
            l1i = index % self.l1
        else:
            l0i = index / U(self.l1)
            l1i = index % U(self.l1)

        tf = get_attr(self.ref, "indexTransform")
        if tf is not None:
            newIndex = Index(tf(l0i), l1i)
        else:
            newIndex = Index(Index(self.ref, l0i), l1i)

        return newIndex
Ejemplo n.º 15
0
 def size(self):
     isVec, typ = get_attr(self, "provideVector")()
     if isVec:
         return typ.size
     else:
         raise Exception(f"${self} is not vector type")
Ejemplo n.º 16
0
 def _transform(self):
     if has_attr(self.ref, "indexTransform"):
         index = get_attr(self.ref, "indexTransform")(self.index)
     else:
         index = self
     return index
Ejemplo n.º 17
0
 def __getattribute__(self, item):
     res = get_attr(self, item)
     if res is not None:
         return res
     else:
         return SubField(getattr(self.typ, item).value, item, self)
Ejemplo n.º 18
0
    def __iter__(self):
        isVec, typ = get_attr(self, "provideVector")()
        if isVec:
            return iter([self[i] for i in range(typ.size)])

        raise Exception(f"${self} is not vector type")
Ejemplo n.º 19
0
 def __repr__(self):
     value = get_attr(self, "value")
     name = get_attr(self, "name")
     ref = get_attr(self, "ref")
     return "SubField(value=" + str(value) + ", name=" + str(
         name) + ", ref=object of " + str(get_attr(ref, "__class__")) + ")"
Ejemplo n.º 20
0
 def public(self):
     return get_attr(self, "value")
Ejemplo n.º 21
0
 def __getattribute__(self, item):
     if has_attr(self, item):
         return get_attr(self, item)
     else:
         return getattr(self.public(), item)
Ejemplo n.º 22
0
 def getAttr(self, item):
     return get_attr(self, item)
Ejemplo n.º 23
0
 def __getattribute__(self, item):
     res = get_attr(self, item)
     if res is not None:
         return res
     else:
         return SubField(getattr(self, '_kv')[item], item, None)
Ejemplo n.º 24
0
 def __repr__(self):
     value = get_attr(self, "value")
     return "Pub(" + str(value) + ")"
Ejemplo n.º 25
0
 def extractForName(self):
     return get_attr(self, "value")