def withRes(opDef, operands, resT): """ Create operator with result signal :ivar ~.resT: data type of result signal :ivar ~.outputs: iterable of signals which are outputs from this operator """ # try return existing operator result for i, o in enumerate(operands): if isinstance(o, RtlSignalBase): if i == 0: k = (opDef, i, *operands[1:]) else: k = (opDef, i, *operands[:i], *operands[i + 1:]) try: return o._usedOps[k] except KeyError: pass break # instanciate new Operator op = Operator(opDef, operands) out = RtlSignal(getCtxFromOps(operands), None, resT) out._const = arr_all(op.operands, isConst) out.drivers.append(op) out.origin = op op.result = out # Register potential signals to drivers/endpoints first_signal = True for i, o in enumerate(op.operands): if isinstance(o, RtlSignalBase): o.endpoints.append(op) if first_signal: # register operator in _usedOps operator cache if i == 0: k = (opDef, i, *operands[1:]) else: k = (opDef, i, *operands[:i], *operands[i + 1:]) o._usedOps[k] = out o._usedOpsAlias[k] = { k, } first_signal = False elif isinstance(o, HValue): pass else: raise NotImplementedError("Operator operands can be" " only signal or values got:%r" % (o)) if out._const: out.staticEval() return out
def withRes(opDef, operands, resT, outputs=[]): """ Create operator with result signal :ivar resT: data type of result signal :ivar outputs: iterable of singnals which are outputs from this operator """ op = Operator(opDef, operands) out = RtlSignal(getCtxFromOps(operands), None, resT) out._const = arr_all(op.operands, isConst) out.drivers.append(op) out.origin = op op.result = out op.registerSignals(outputs) if out._const: out.staticEval() return out
def unhideResultsOfIndexingAndConcatOnPublicSignals(netlist: RtlNetlist): openset = UniqList( sorted((s for s in netlist.signals if not s.hidden), key=RtlSignal_sort_key)) epsToReplace = [] while openset: s = openset.pop() s: RtlSignal for ep in s.endpoints: # search for index ops if isinstance(ep, Operator)\ and ep.operator == AllOps.INDEX\ and ep.operands[0] is s: ep: Operator isIndexInBramWrite = isinstance(s._dtype, HArray)\ and arr_all(ep.result.endpoints, lambda ep: isinstance(ep, HdlStatement)\ and ep._event_dependent_from_branch == 0) if not isIndexInBramWrite and ep.result.hidden: epsToReplace.append(ep) for ep in epsToReplace: ep: Operator r = ep.result assert len(r.drivers) == 1, r r.hidden = False i = ep.operands[1] ep._destroy() # instantiate new hidden signal for result of index new_r = s[i] assert new_r is not r, r # and instantiate HdlAssignmentContainer to this new signal from the # old one r(new_r) openset.append(r) epsToReplace.clear()