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
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
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
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")
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
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
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)
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)
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)
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")
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)
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
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
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
def size(self): isVec, typ = get_attr(self, "provideVector")() if isVec: return typ.size else: raise Exception(f"${self} is not vector type")
def _transform(self): if has_attr(self.ref, "indexTransform"): index = get_attr(self.ref, "indexTransform")(self.index) else: index = self return index
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)
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")
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__")) + ")"
def public(self): return get_attr(self, "value")
def __getattribute__(self, item): if has_attr(self, item): return get_attr(self, item) else: return getattr(self.public(), item)
def getAttr(self, item): return get_attr(self, item)
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)
def __repr__(self): value = get_attr(self, "value") return "Pub(" + str(value) + ")"
def extractForName(self): return get_attr(self, "value")