예제 #1
0
    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)
예제 #2
0
파일: _instance.py 프로젝트: arhik/myhdl
    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
예제 #3
0
파일: _instance.py 프로젝트: unornate/myhdl
    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
예제 #4
0
    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
예제 #5
0
    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)
예제 #6
0
    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
예제 #7
0
            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):
예제 #8
0
            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):
예제 #9
0
    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)