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)
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
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
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
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
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
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
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
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
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