def __init__(self, func, symdict): self.symdict = symdict s = inspect.getsource(func) s = _dedent(s) tree = ast.parse(s) # print ast.dump(tree) v = _AttrRefTransformer(self) v.visit(tree) v = _SigNameVisitor(self.symdict) v.visit(tree) self.inputs = v.results["input"] self.outputs = v.results["output"] inouts = v.results["inout"] | self.inputs.intersection(self.outputs) if inouts: raise AlwaysCombError(_error.SignalAsInout % inouts) if v.results["embedded_func"]: raise AlwaysCombError(_error.EmbeddedFunction) senslist = [] for n in self.inputs: s = self.symdict[n] if isinstance(s, _Signal): senslist.append(s) elif _isListOfSigs(s): senslist.extend(s) self.senslist = tuple(senslist) if len(self.senslist) == 0: raise AlwaysCombError(_error.EmptySensitivityList) super(_AlwaysComb, self).__init__(func, senslist)
def __init__(self, genfunc): self.genfunc = genfunc self.gen = genfunc() # infer symdict f = self.funcobj varnames = f.__code__.co_varnames symdict = {} for n, v in f.__globals__.items(): if n not in varnames: symdict[n] = v # handle free variables freevars = f.__code__.co_freevars if freevars: closure = (c.cell_contents for c in f.__closure__) symdict.update(zip(freevars, closure)) self.symdict = symdict tree = self.ast # print ast.dump(tree) v = _AttrRefTransformer(self) v.visit(tree) v = _SigNameVisitor(self.symdict) v.visit(tree) self.inputs = v.inputs self.outputs = v.outputs self.inouts = v.inouts self.embedded_func = v.embedded_func
def __init__(self, genfunc, callinfo): self.callinfo = callinfo self.callername = callinfo.name self.modctxt = callinfo.modctxt self.genfunc = genfunc self.gen = genfunc() # infer symdict f = self.funcobj varnames = f.__code__.co_varnames symdict = {} for n, v in callinfo.symdict.items(): if n not in varnames: symdict[n] = v self.symdict = symdict # print modname, genfunc.__name__ tree = self.ast # print ast.dump(tree) v = _AttrRefTransformer(self) v.visit(tree) v = _SigNameVisitor(self.symdict) v.visit(tree) self.inputs = v.inputs self.outputs = v.outputs self.inouts = v.inouts self.embedded_func = v.embedded_func self.sigdict = v.sigdict self.losdict = v.losdict
def __init__(self, genfunc): self.genfunc = genfunc self.gen = genfunc() # infer symdict f = self.funcobj varnames = f.__code__.co_varnames symdict = {} for n, v in f.__globals__.items(): if n not in varnames: symdict[n] = v # handle free variables freevars = f.__code__.co_freevars if freevars: closure = (c.cell_contents for c in f.__closure__) symdict.update(zip(freevars, closure)) self.symdict = symdict tree = self.ast # print ast.dump(tree) v = _AttrRefTransformer(self) v.visit(tree) v = _SigNameVisitor(self.symdict) v.visit(tree) self.inputs = v.inputs self.outputs = v.outputs self.inouts = v.inouts self.embedded_func = v.embedded_func
def __init__(self, func): senslist = [] super(_AlwaysComb, self).__init__(func, senslist) s = inspect.getsource(func) s = _dedent(s) tree = ast.parse(s) # print ast.dump(tree) v = _AttrRefTransformer(self) v.visit(tree) v = _SigNameVisitor(self.symdict) v.visit(tree) self.inputs = v.results['input'] self.outputs = v.results['output'] inouts = v.results['inout'] | self.inputs.intersection(self.outputs) if inouts: raise AlwaysCombError(_error.SignalAsInout % inouts) if v.results['embedded_func']: raise AlwaysCombError(_error.EmbeddedFunction) for n in self.inputs: s = self.symdict[n] if isinstance(s, _Signal): senslist.append(s) elif _isListOfSigs(s): senslist.extend(s) self.senslist = tuple(senslist) if len(self.senslist) == 0: raise AlwaysCombError(_error.EmptySensitivityList)
def __init__(self, genfunc, callinfo): self.callinfo = callinfo self.callername = callinfo.name self.modctxt = callinfo.modctxt self.genfunc = genfunc self.gen = genfunc() # infer symdict f = self.funcobj varnames = f.__code__.co_varnames symdict = {} for n, v in callinfo.symdict.items(): if n not in varnames: symdict[n] = v self.symdict = symdict # print modname, genfunc.__name__ tree = self.ast # print ast.dump(tree) v = _AttrRefTransformer(self) v.visit(tree) v = _SigNameVisitor(self.symdict) v.visit(tree) self.inputs = v.inputs self.outputs = v.outputs self.inouts = v.inouts self.embedded_func = v.embedded_func self.sigdict = v.sigdict self.losdict = v.losdict
for n, c in zip(func.__code__.co_freevars, func.__closure__): try: obj = _cell_deref(c) symdict[n] = obj except NameError: raise NameError(n) self.symdict = symdict # now infer outputs to be reset s = inspect.getsource(func) s = _dedent(s) tree = ast.parse(s) # print ast.dump(tree) v = _AttrRefTransformer(self) v.visit(tree) v = _SigNameVisitor(self.symdict) v.visit(tree) if v.results['inout']: raise AlwaysSeqError(_error.SigAugAssign, v.results['inout']) if v.results['embedded_func']: raise AlwaysSeqError(_error.EmbeddedFunction) sigregs = self.sigregs = [] varregs = self.varregs = [] for n in v.results['output']: reg = self.symdict[n] if isinstance(reg, _Signal): sigregs.append(reg) elif isinstance(reg, intbv):
for n, c in zip(func.__code__.co_freevars, func.__closure__): try: obj = _cell_deref(c) symdict[n] = obj except NameError: raise NameError(n) self.symdict = symdict # now infer outputs to be reset s = inspect.getsource(func) s = _dedent(s) tree = ast.parse(s) # print ast.dump(tree) v = _AttrRefTransformer(self) v.visit(tree) v = _SigNameVisitor(self.symdict) v.visit(tree) if v.results['inout']: raise AlwaysSeqError(_error.SigAugAssign, v.results['inout']) if v.results['embedded_func']: raise AlwaysSeqError(_error.EmbeddedFunction) sigregs = self.sigregs = [] varregs = self.varregs = [] for n in v.results['output']: reg = self.symdict[n] if isinstance(reg, _Signal): sigregs.append(reg) elif isinstance(reg, intbv):
def __init__(self, func): def senslistexpand(senslist, reg): # print(repr(reg)) if isinstance(reg, _Signal): senslist.append(reg) elif isinstance(reg, StructType): # print('senslistexpand StructType', repr(reg)) refs = vars(reg) # print(refs) for k in refs: # print(refs[k]) if isinstance(refs[k], _Signal): senslist.append(refs[k]) elif isinstance(refs[k], (list, Array)): if len(refs[k]) != 0: senslistexpand(senslist, refs[k]) elif isinstance(refs[k], StructType): senslistexpand(senslist, refs[k]) else: # print('senslistexpand passing {}?'.format(k)) pass elif isinstance(reg, (list, Array)): if isinstance(reg[0], (list, Array)): for r in reg: senslistexpand(senslist, r) else: if isinstance(reg[0], StructType): for rr in reg: senslistexpand(senslist, rr) elif isinstance(reg[0], _Signal): senslist.extend(reg) # elif isinstance(reg, Array): # senslist.extend(reg._array) # elif isinstance(reg, list): # senslist.extend(reg) # self.func = func # self.symdict = symdict senslist = [] super(_AlwaysComb, self).__init__(func, senslist) # print('_AlwaysComb', senslist) s = inspect.getsource(func) s = _dedent(s) tree = ast.parse(s) # print(ast.dump(tree)) # for item in ast.dump(tree).split(): # print(item) v = _AttrRefTransformer(self) v.visit(tree) # print(ast.dump(tree)) # for item in ast.dump(tree).split(): # print(item) v = _SigNameVisitor(self.symdict) v.visit(tree) # print(ast.dump(tree)) # for item in ast.dump(tree).split(): # print(item) self.inputs = v.results['input'] self.outputs = v.results['output'] # print(v.results) # print('inputs:', self.inputs) # print('outputs:', self.outputs) # inouts = v.results['inout'] | self.inputs.intersection(self.outputs) # if inouts: # raise AlwaysCombError(_error.SignalAsInout % inouts) if v.results['embedded_func']: raise AlwaysCombError(_error.EmbeddedFunction) # print(self.inputs) # print('2', self.senslist) for n in self.inputs: s = self.symdict[n] # print(n,s) # print(n, s, isinstance(s, StructType), isinstance(s, (list, Array))) senslistexpand(senslist, s) # if isinstance(s, _Signal): # senslist.append(s) # elif isinstance(s, list): # # print(repr(s)) # # list or Array of sigs # senslistexpand(senslist, s) # elif isinstance(s, Array): # # Array of sigs # if not isinstance(s.element, intbv): # senslistexpand(senslist, s) # elif isinstance(s, StructType): # senslistexpand(senslist, s) # elif _isListOfSigs(s): # senslist.extend(s) # else : # # print('_always_comb', n) # pass # print('3', self.senslist) self.senslist = tuple(senslist) # print('4', self.senslist) self.gen = self.genfunc() # for item in self.senslist: # print(item._name, repr(item)) # print() if len(self.senslist) == 0: raise AlwaysCombError(_error.EmptySensitivityList)