Exemplo n.º 1
0
def collectElements(mlist, workerfn, name):
    methods = []
    mindex = 0
    for item in mlist:
        if verbose:
            print 'collectEl', item
            for p in item['dparams']:
                print 'collectEl/param', p
                break
        sub = { 'dut': util.decapitalize(name),
          'Dut': util.capitalize(name),
          'methodName': item['dname'],
          'MethodName': util.capitalize(item['dname']),
          'channelNumber': mindex}
        paramStructDeclarations = ['    %s %s;' % (toBsvType(p['ptype'], p.get('oldtype')), p['pname']) for p in item['dparams']]
        sub['paramType'] = ', '.join(['%s' % toBsvType(p['ptype'], p.get('oldtype')) for p in item['dparams']])
        sub['formals'] = ', '.join(['%s %s' % (toBsvType(p['ptype'], p.get('oldtype')), p['pname']) for p in item['dparams']])
        structElements = ['%s: %s' % (p['pname'], p['pname']) for p in item['dparams']]
        if not item['dparams']:
            paramStructDeclarations = ['    %s %s;' % ('Bit#(32)', 'padding')]
            structElements = ['padding: 0']
        sub['paramStructDeclarations'] = '\n'.join(paramStructDeclarations)
        sub['structElements'] = ', '.join(structElements)
        methods.append(workerfn % sub)
        mindex = mindex + 1
    return ''.join(methods)
Exemplo n.º 2
0
def fixupSubsts(item, suffix):
    name = item['cname']+suffix
    dlist = item['cdecls']
    mkConnectionMethodRules = []
    outputPipes = []
    for m in dlist:
        if verbose:
            print 'fixupSubsts', m
        paramsForCall = ['request.%s' % p['pname'] for p in m['dparams']]
        msubs = {'methodName': m['dname'],
                 'paramsForCall': ', '.join(paramsForCall)}
        mkConnectionMethodRules.append(mkConnectionMethodTemplate % msubs)
        outputPipes.append('        interface %(methodName)s_PipeOut = %(methodName)s_requestAdapter.out;' % msubs)
    substs = {
        'Package': '',
        'channelCount': len(dlist),
        'Ifc': item['cname'],
        'dut': util.decapitalize(name),
        'Dut': util.capitalize(name),
    }
    if not generateInterfaceDefs:
        substs['Package'] = item['Package'] + '::'
    substs['requestOutputPipeInterfaces'] = ''.join(
        [requestOutputPipeInterfaceTemplate % {'methodName': m['dname'],
                                               'MethodName': util.capitalize(m['dname'])} for m in dlist])
    substs['outputPipes'] = '\n'.join(outputPipes)
    substs['mkConnectionMethodRules'] = ''.join(mkConnectionMethodRules)
    substs['indicationMethodRules'] = collectElements(dlist, indicationRuleTemplate, name)
    substs['indicationMethods'] = collectElements(dlist, indicationMethodTemplate, name)
    substs['requestElements'] = collectElements(dlist, requestStructTemplate, name)
    substs['methodRules'] = collectElements(dlist, requestRuleTemplate, name)
    substs['methodDef'] = collectElements(dlist, methodDefTemplate, name)
    substs['messageSizes'] = collectElements(dlist, messageSizeTemplate, name)
    return substs
Exemplo n.º 3
0
def fixupSubsts(item, suffix):
    name = item['name']+suffix
    dlist = item['decls']
    mkConnectionMethodRules = []
    outputPipes = []
    for m in dlist:
        paramsForCall = ['request.%s' % p['name'] for p in m['params']]
        msubs = {'methodName': m['name'],
                 'paramsForCall': ', '.join(paramsForCall)}
        mkConnectionMethodRules.append(mkConnectionMethodTemplate % msubs)
        outputPipes.append('    interface %(methodName)s_PipeOut = toPipeOut(%(methodName)s_requestFifo);' % msubs)
    substs = {
        'Package': item['Package'],
        'channelCount': len(dlist),
        'moduleContext': item['moduleContext'],
        'Ifc': item['name'],
        'dut': util.decapitalize(name),
        'Dut': util.capitalize(name),
        'portalIfc': portalIfcTemplate,
    }
    substs['requestOutputPipeInterfaces'] = ''.join(
        [requestOutputPipeInterfaceTemplate % {'methodName': p['name'],
                                               'MethodName': util.capitalize(p['name'])} for p in dlist])
    substs['outputPipes'] = '\n'.join(outputPipes)
    substs['mkConnectionMethodRules'] = ''.join(mkConnectionMethodRules)
    substs['responseElements'] = collectElements(dlist, responseStructTemplate, name)
    substs['indicationMethodRules'] = collectElements(dlist, indicationRuleTemplate, name)
    substs['indicationMethods'] = collectElements(dlist, indicationMethodTemplate, name)
    substs['requestElements'] = collectElements(dlist, requestStructTemplate, name)
    substs['methodRules'] = collectElements(dlist, requestRuleTemplate, name)
    return substs
Exemplo n.º 4
0
    def substs(self,suffix,expose,proxy):
        name = "%s%s"%(self.name,suffix)
        dutName = util.decapitalize(name)
        methods = [d for d in self.decls if d.type == 'Method' and d.return_type.name == 'Action']

        # specific to wrappers
        requestElements = self.collectRequestElements(name)
        methodNames = self.collectMethodNames(name)
        methodRuleNames = self.collectMethodRuleNames(name)
        methodRules = self.collectMethodRules(name,not expose)
        
        # specific to proxies
        responseElements = self.collectResponseElements(name)
        indicationMethodRuleNames = self.collectIndicationMethodRuleNames(name)
        indicationMethodRules = self.collectIndicationMethodRules(name)
        indicationMethods = self.collectIndicationMethods(name)
        indicationMethodDecls = self.collectIndicationMethodDecls(name)

        m = md5.new()
        m.update(self.name)

        substs = {
            'Ifc': self.name,
            'dut': dutName,
            'Dut': util.capitalize(name),
            'requestElements': ''.join(requestElements),
            'methodNames': methodNames,
            'methodRules': ''.join(methodRules),
            'requestFailureRuleNames': "" if len(methodNames) == 0 else '(* descending_urgency = "'+', '.join(['handle_%s_requestFailure' % n for n in methodNames])+'"*)',
            'channelCount': self.channelCount,
            'writeChannelCount': self.channelCount,
            'hiddenProxy' : "%sStatus" % name,
            'moduleContext': '',

            'requestChannelCount': len(methodRules) if not proxy else 0,
            'responseElements': ''.join(responseElements),
            'indicationMethodRules': ''.join(indicationMethodRules),
            'indicationMethods': ''.join(indicationMethods),
            'indicationMethodDecls' :''.join(indicationMethodDecls),
            'indicationChannelCount': self.channelCount if proxy else 0,
            'indicationInterfaces': ''.join(indicationTemplate % { 'Indication': name }) if not self.hasSource else '',
            'hiddenWrapper' : "%sStatus" % name,
            'startIndicationMethods' : '' if not expose else '    interface %s ifc;' % self.name,
            'endIndicationMethods' : '' if not expose else '    endinterface',
            'slaveFifoSelExposed' : '1' if proxy else '0',
            'slaveFifoSelHidden'  : '0' if proxy else '1',
            }

        substs['portalIfcInterrupt'] = 'interface ReadOnly interrupt = p.interrupt;' if not proxy else proxyInterruptImplTemplate
        substs['ifcType'] = 'truncate(128\'h%s)' % m.hexdigest()
        substs['portalIfc'] = portalIfcTemplate % substs
        substs['wrapperCtrl'] = wrapperCtrlTemplate % substs
        substs['proxyCtrl'] = proxyCtrlTemplate % substs
        return substs
Exemplo n.º 5
0
    def substs(self,suffix,proxy):
        name = "%s%s"%(self.name,suffix)
        dutName = util.decapitalize(name)

        # specific to wrappers
        requestElements = self.collectRequestElements(name)
        methodNames = self.collectMethodNames(name)
        methodRules = self.collectMethodRules(name,False)
        
        # specific to proxies
        responseElements = self.collectResponseElements(name)
        indicationMethodRules = self.collectIndicationMethodRules(name)
        indicationMethods = self.collectIndicationMethods(name)

        m = md5.new()
        m.update(self.name)

        substs = {
            'Ifc': self.name,
            'dut': dutName,
            'Dut': util.capitalize(name),
            'requestElements': ''.join(requestElements),
            'methodNames': methodNames,
            'methodRules': ''.join(methodRules),
            'channelCount': self.channelCount,
            'moduleContext': '',

            'requestChannelCount': len(methodRules) if not proxy else 0,
            'responseElements': ''.join(responseElements),
            'indicationMethodRules': ''.join(indicationMethodRules),
            'indicationMethods': ''.join(indicationMethods),
            'indicationChannelCount': self.channelCount if proxy else 0,
            'indicationInterfaces': ''.join(indicationTemplate % { 'Indication': name }) if not self.hasSource else '',
            }

        substs['ifcType'] = 'truncate(128\'h%s)' % m.hexdigest()
        substs['portalIfc'] = portalIfcTemplate % substs
        substs['requestOutputPipeInterfaces'] = ''.join([requestOutputPipeInterfaceTemplate % {'methodName': methodName,
                                                       'MethodName': util.capitalize(methodName)}
                                                       for methodName in methodNames])
        mkConnectionMethodRules = []
        outputPipes = []
        for m in self.decls:
            if m.type == 'Method' and m.return_type.name == 'Action':
                paramsForCall = ['request.%s' % p.name for p in m.params]
                msubs = {'methodName': m.name,
                         'paramsForCall': ', '.join(paramsForCall)}
                mkConnectionMethodRules.append(mkConnectionMethodTemplate % msubs)
                outputPipes.append('    interface %(methodName)s_PipeOut = toPipeOut(%(methodName)s_requestFifo);' % msubs)
        substs['mkConnectionMethodRules'] = ''.join(mkConnectionMethodRules)
        substs['outputPipes'] = '\n'.join(outputPipes)
        return substs
Exemplo n.º 6
0
 def substs(self, outerTypeName):
     if self.return_type.name == 'ActionValue':
         rt = self.return_type.params[0].toBsvType()
     else:
         rt = self.return_type.name
     d = { 'dut': util.decapitalize(outerTypeName),
           'Dut': util.capitalize(outerTypeName),
           'methodName': self.name,
           'MethodName': util.capitalize(self.name),
           'channelNumber': self.channelNumber,
           'ord': self.channelNumber,
           'methodReturnType': rt}
     return d
Exemplo n.º 7
0
 def substs(self, outerTypeName):
     if self.return_type.name == 'ActionValue':
         rt = self.return_type.params[0].toBsvType()
     else:
         rt = self.return_type.name
     d = {
         'dut': util.decapitalize(outerTypeName),
         'Dut': util.capitalize(outerTypeName),
         'methodName': self.name,
         'MethodName': util.capitalize(self.name),
         'channelNumber': self.channelNumber,
         'ord': self.channelNumber,
         'methodReturnType': rt
     }
     return d
Exemplo n.º 8
0
def generate_cpp(project_dir, noisyFlag, jsondata):
    global globalv_globalvars, verbose, bsvdefines

    def create_cpp_file(name):
        fname = os.path.join(project_dir, generatedSubdirectory, name)
        f = util.createDirAndOpen(fname, 'w')
        if verbose:
            print "Writing file ", fname
        f.write('#include "GeneratedTypes.h"\n')
        return f

    verbose = noisyFlag
    bsvdefines = {}
    for binding in jsondata['bsvdefines']:
        if '=' in binding:
            print 'split', binding.split('=')
            var, val = binding.split('=')
            bsvdefines[var] = val
        else:
            bsvdefines[binding] = binding
    generatedCFiles = []
    globalv_globalvars = {}
    hname = os.path.join(project_dir, generatedSubdirectory,
                         'GeneratedTypes.h')
    generated_hpp = util.createDirAndOpen(hname, 'w')
    generated_hpp.write('#ifndef __GENERATED_TYPES__\n')
    generated_hpp.write('#define __GENERATED_TYPES__\n')
    generated_hpp.write('#include "portal.h"\n')
    generated_hpp.write('#ifdef __cplusplus\n')
    generated_hpp.write('extern "C" {\n')
    generated_hpp.write('#endif\n')
    # global type declarations used by interface mthods
    for v in jsondata['globaldecls']:
        if v['dtype'] == 'TypeDef':
            globalv_globalvars[v['tname']] = v
            if v.get('tparams'):
                print 'Skipping C++ declaration for parameterized type', v[
                    'tname']
                continue
            emitCD(v, generated_hpp, 0)
    generated_hpp.write('\n')
    cppname = 'GeneratedCppCallbacks.cpp'
    generated_cpp = create_cpp_file(cppname)
    generatedCFiles.append(cppname)
    generated_cpp.write('\n#ifndef NO_CPP_PORTAL_CODE\n')
    for decl in jsondata['globaldecls']:
        if decl['tname'] == 'IfcNames':
            ifcnames = decl['tdtype']['elements']
            for (ifcname, ifcvalue) in ifcnames:
                generated_cpp.write('extern const uint32_t %s = %s;\n' %
                                    (util.decapitalize(ifcname), ifcname))
    for item in jsondata['interfaces']:
        if verbose:
            print 'generateclass', item
        generate_class(item['cname'], '', item['cdecls'], generatedCFiles,
                       create_cpp_file, generated_hpp, generated_cpp,
                       item.get('direction'))
        if generateJson:
            generate_class(item['cname'], 'Json', item['cdecls'],
                           generatedCFiles, create_cpp_file, generated_hpp,
                           generated_cpp, item.get('direction'))
    generated_cpp.write('#endif //NO_CPP_PORTAL_CODE\n')
    generated_cpp.close()
    generated_hpp.write('#ifdef __cplusplus\n')
    generated_hpp.write('}\n')
    generated_hpp.write('#endif\n')
    generated_hpp.write('#endif //__GENERATED_TYPES__\n')
    generated_hpp.close()
    if not suppressGeneratedMakefile:
        gen_makefile = util.createDirAndOpen(
            os.path.join(project_dir, generatedSubdirectory,
                         'Makefile.generated_files'), 'w')
        gen_makefile.write('\nGENERATED_CPP=' + ' '.join(generatedCFiles) +
                           '\n')
        gen_makefile.close()
    return generatedCFiles
Exemplo n.º 9
0
def generate_cpp(project_dir, noisyFlag, jsondata):
    global globalv_globalvars, verbose, bsvdefines
    def create_cpp_file(name):
        fname = os.path.join(project_dir, generatedSubdirectory, name)
        f = util.createDirAndOpen(fname, 'w')
        if verbose:
            print "Writing file ",fname
        f.write('#include "GeneratedTypes.h"\n')
        return f

    verbose = noisyFlag
    bsvdefines = {}
    for binding in jsondata['bsvdefines']:
        if '=' in binding:
            print 'split', binding.split('=')
            var,val = binding.split('=')
            bsvdefines[var] = val
        else:
            bsvdefines[binding] = binding
    generatedCFiles = []
    globalv_globalvars = {}
    hname = os.path.join(project_dir, generatedSubdirectory, 'GeneratedTypes.h')
    generated_hpp = util.createDirAndOpen(hname, 'w')
    generated_hpp.write('#ifndef __GENERATED_TYPES__\n')
    generated_hpp.write('#define __GENERATED_TYPES__\n')
    generated_hpp.write('#include "portal.h"\n')
    generated_hpp.write('#ifdef __cplusplus\n')
    generated_hpp.write('extern "C" {\n')
    generated_hpp.write('#endif\n')
    # global type declarations used by interface mthods
    for v in jsondata['globaldecls']:
        if v['dtype'] == 'TypeDef':
            globalv_globalvars[v['tname']] = v
            if v.get('tparams'):
                print 'Skipping C++ declaration for parameterized type', v['tname']
                continue
            emitCD(v, generated_hpp, 0)
    generated_hpp.write('\n')
    cppname = 'GeneratedCppCallbacks.cpp'
    generated_cpp = create_cpp_file(cppname)
    generatedCFiles.append(cppname)
    generated_cpp.write('\n#ifndef NO_CPP_PORTAL_CODE\n')
    for decl in jsondata['globaldecls']:
        if decl['tname'] == 'IfcNames':
            ifcnames = decl['tdtype']['elements']
            for (ifcname,ifcvalue) in ifcnames:
                generated_cpp.write('extern const uint32_t %s = %s;\n' % (util.decapitalize(ifcname), ifcname))
    for item in jsondata['interfaces']:
        if verbose:
            print 'generateclass', item
        generate_class(item['cname'],     '', item['cdecls'], generatedCFiles, create_cpp_file, generated_hpp, generated_cpp, item.get('direction'))
        if generateJson:
            generate_class(item['cname'], 'Json', item['cdecls'], generatedCFiles, create_cpp_file, generated_hpp, generated_cpp, item.get('direction'))
    generated_cpp.write('#endif //NO_CPP_PORTAL_CODE\n')
    generated_cpp.close()
    generated_hpp.write('#ifdef __cplusplus\n')
    generated_hpp.write('}\n')
    generated_hpp.write('#endif\n')
    generated_hpp.write('#endif //__GENERATED_TYPES__\n')
    generated_hpp.close()
    if not suppressGeneratedMakefile:
        gen_makefile = util.createDirAndOpen(os.path.join(project_dir, generatedSubdirectory, 'Makefile.generated_files'), 'w')
        gen_makefile.write('\nGENERATED_CPP=' + ' '.join(generatedCFiles)+'\n')
        gen_makefile.close()
    return generatedCFiles
Exemplo n.º 10
0
    def substs(self, suffix, proxy):
        name = "%s%s" % (self.name, suffix)
        dutName = util.decapitalize(name)

        # specific to wrappers
        requestElements = self.collectRequestElements(name)
        methodNames = self.collectMethodNames(name)
        methodRules = self.collectMethodRules(name, False)

        # specific to proxies
        responseElements = self.collectResponseElements(name)
        indicationMethodRules = self.collectIndicationMethodRules(name)
        indicationMethods = self.collectIndicationMethods(name)

        m = md5.new()
        m.update(self.name)

        substs = {
            'Ifc':
            self.name,
            'dut':
            dutName,
            'Dut':
            util.capitalize(name),
            'requestElements':
            ''.join(requestElements),
            'methodNames':
            methodNames,
            'methodRules':
            ''.join(methodRules),
            'channelCount':
            self.channelCount,
            'moduleContext':
            '',
            'requestChannelCount':
            len(methodRules) if not proxy else 0,
            'responseElements':
            ''.join(responseElements),
            'indicationMethodRules':
            ''.join(indicationMethodRules),
            'indicationMethods':
            ''.join(indicationMethods),
            'indicationChannelCount':
            self.channelCount if proxy else 0,
            'indicationInterfaces':
            ''.join(indicationTemplate %
                    {'Indication': name}) if not self.hasSource else '',
        }

        substs['ifcType'] = 'truncate(128\'h%s)' % m.hexdigest()
        substs['portalIfc'] = portalIfcTemplate % substs
        substs['requestOutputPipeInterfaces'] = ''.join([
            requestOutputPipeInterfaceTemplate % {
                'methodName': methodName,
                'MethodName': util.capitalize(methodName)
            } for methodName in methodNames
        ])
        mkConnectionMethodRules = []
        outputPipes = []
        for m in self.decls:
            if m.type == 'Method' and m.return_type.name == 'Action':
                paramsForCall = ['request.%s' % p.name for p in m.params]
                msubs = {
                    'methodName': m.name,
                    'paramsForCall': ', '.join(paramsForCall)
                }
                mkConnectionMethodRules.append(mkConnectionMethodTemplate %
                                               msubs)
                outputPipes.append(
                    '    interface %(methodName)s_PipeOut = toPipeOut(%(methodName)s_requestFifo);'
                    % msubs)
        substs['mkConnectionMethodRules'] = ''.join(mkConnectionMethodRules)
        substs['outputPipes'] = '\n'.join(outputPipes)
        return substs