ABITestGen.py revision ec1abb9bd70f67a0a93bb5c9ffeafc184cb551d0
1a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar#!/usr/bin/python 2a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 3a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbarfrom pprint import pprint 4a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbarimport random, atexit, time 5a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbarfrom random import randrange 60f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbarimport re 7a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 8a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbarfrom Enumeration import * 9a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbarfrom TypeGen import * 10a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 11a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar#### 12a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 13a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbarclass TypePrinter: 14a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar def __init__(self, output, outputHeader=None, 15a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar outputTests=None, outputDriver=None, 16a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar headerName=None, info=None): 17a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.output = output 18a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.outputHeader = outputHeader 19a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.outputTests = outputTests 20a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.outputDriver = outputDriver 21a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.writeBody = outputHeader or outputTests or outputDriver 22a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.types = {} 23a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.testValues = {} 24a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.testReturnValues = {} 255ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar self.layoutTests = [] 26a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 27a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if info: 28a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for f in (self.output,self.outputHeader,self.outputTests,self.outputDriver): 29a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if f: 30a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>f,info 31a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 32a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if self.writeBody: 33a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.output, '#include <stdio.h>\n' 34a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if self.outputTests: 359dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar print >>self.outputTests, '#include <stdio.h>' 369dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar print >>self.outputTests, '#include <string.h>' 379dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar print >>self.outputTests, '#include <assert.h>\n' 38a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 39a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if headerName: 40a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for f in (self.output,self.outputTests,self.outputDriver): 41a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if f is not None: 42a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>f, '#include "%s"\n'%(headerName,) 43a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 44a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if self.outputDriver: 459dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar print >>self.outputDriver, '#include <stdio.h>\n' 46a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputDriver, 'int main(int argc, char **argv) {' 47a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 48a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar def finish(self): 495ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar if self.layoutTests: 505ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar print >>self.output, 'int main(int argc, char **argv) {' 515ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar for f in self.layoutTests: 525ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar print >>self.output, ' %s();' % f 535ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar print >>self.output, ' return 0;' 545ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar print >>self.output, '}' 555ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar 56a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if self.outputDriver: 579dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar print >>self.outputDriver, ' printf("DONE\\n");' 58a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputDriver, ' return 0;' 595ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar print >>self.outputDriver, '}' 60a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 61a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar def getTypeName(self, T): 62a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if isinstance(T,BuiltinType): 63a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar return T.name 64a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar name = self.types.get(T) 65a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if name is None: 66a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar name = 'T%d'%(len(self.types),) 67a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar # Reserve slot 68a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.types[T] = None 69a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if self.outputHeader: 70a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputHeader,T.getTypedefDef(name, self) 71a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar else: 72a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.output,T.getTypedefDef(name, self) 73a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if self.outputTests: 74a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests,T.getTypedefDef(name, self) 75a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.types[T] = name 76a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar return name 77a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 785ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar def writeLayoutTest(self, i, ty): 795ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar tyName = self.getTypeName(ty) 805ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar tyNameClean = tyName.replace(' ','_').replace('*','star') 815ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar fnName = 'test_%s' % tyNameClean 825ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar 835ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar print >>self.output,'void %s(void) {' % fnName 845ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar self.printSizeOfType(' %s'%fnName, tyName, ty, self.output) 855ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar self.printAlignOfType(' %s'%fnName, tyName, ty, self.output) 865ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar self.printOffsetsOfType(' %s'%fnName, tyName, ty, self.output) 875ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar print >>self.output,'}' 885ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar print >>self.output 895ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar 905ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar self.layoutTests.append(fnName) 915ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar 92a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar def writeFunction(self, i, FT): 93a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar args = ', '.join(['%s arg%d'%(self.getTypeName(t),i) for i,t in enumerate(FT.argTypes)]) 94a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if not args: 95a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar args = 'void' 96a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 97a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if FT.returnType is None: 98a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar retvalName = None 99a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar retvalTypeName = 'void' 100a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar else: 101a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar retvalTypeName = self.getTypeName(FT.returnType) 102a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if self.writeBody or self.outputTests: 103a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar retvalName = self.getTestReturnValue(FT.returnType) 104a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 105a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar fnName = 'fn%d'%(FT.index,) 106a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if self.outputHeader: 107a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputHeader,'%s %s(%s);'%(retvalTypeName, fnName, args) 108a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elif self.outputTests: 109a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests,'%s %s(%s);'%(retvalTypeName, fnName, args) 110a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 111a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.output,'%s %s(%s)'%(retvalTypeName, fnName, args), 112a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if self.writeBody: 113a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.output, '{' 114a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 115a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for i,t in enumerate(FT.argTypes): 116a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.printValueOfType(' %s'%fnName, 'arg%d'%i, t) 117a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 118a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if retvalName is not None: 119a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.output, ' return %s;'%(retvalName,) 120a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.output, '}' 121a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar else: 122a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.output, '{}' 123a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.output 124a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 125a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if self.outputDriver: 126a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputDriver, ' { extern void test_%s(void); test_%s(); }\n'%(fnName,fnName,) 127a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 128a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if self.outputTests: 129a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if self.outputHeader: 130a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputHeader, 'void test_%s(void);'%(fnName,) 131a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 132a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if retvalName is None: 133a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar retvalTests = None 134a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar else: 135a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar retvalTests = self.getTestValuesArray(FT.returnType) 136a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar tests = map(self.getTestValuesArray, FT.argTypes) 137a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests, 'void test_%s(void) {'%(fnName,) 138a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 139a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if retvalTests is not None: 140a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests, ' printf("%s: testing return.\\n");'%(fnName,) 141a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests, ' for (int i=0; i<%d; ++i) {'%(retvalTests[1],) 142a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar args = ', '.join(['%s[%d]'%(t,randrange(l)) for t,l in tests]) 143a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests, ' %s RV;'%(retvalTypeName,) 144a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests, ' %s = %s[i];'%(retvalName, retvalTests[0]) 145a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests, ' RV = %s(%s);'%(fnName, args) 146a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.printValueOfType(' %s_RV'%fnName, 'RV', FT.returnType, output=self.outputTests, indent=4) 1479dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar self.checkTypeValues('RV', '%s[i]' % retvalTests[0], FT.returnType, output=self.outputTests, indent=4) 148a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests, ' }' 149a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 150a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if tests: 151a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests, ' printf("%s: testing arguments.\\n");'%(fnName,) 152a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for i,(array,length) in enumerate(tests): 153a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for j in range(length): 154a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar args = ['%s[%d]'%(t,randrange(l)) for t,l in tests] 155a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar args[i] = '%s[%d]'%(array,j) 156a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests, ' %s(%s);'%(fnName, ', '.join(args),) 157a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests, '}' 158a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 159a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar def getTestReturnValue(self, type): 160a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar typeName = self.getTypeName(type) 161a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar info = self.testReturnValues.get(typeName) 162a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if info is None: 163a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar name = '%s_retval'%(typeName.replace(' ','_').replace('*','star'),) 164a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.output, '%s %s;'%(typeName,name) 165a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if self.outputHeader: 166a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputHeader, 'extern %s %s;'%(typeName,name) 167a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elif self.outputTests: 168a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests, 'extern %s %s;'%(typeName,name) 169a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar info = self.testReturnValues[typeName] = name 170a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar return info 171a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 172a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar def getTestValuesArray(self, type): 173a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar typeName = self.getTypeName(type) 174a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar info = self.testValues.get(typeName) 175a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if info is None: 176a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar name = '%s_values'%(typeName.replace(' ','_').replace('*','star'),) 177a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests, 'static %s %s[] = {'%(typeName,name) 178a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar length = 0 179a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for item in self.getTestValues(type): 180a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests, '\t%s,'%(item,) 181a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar length += 1 182a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>self.outputTests,'};' 183a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar info = self.testValues[typeName] = (name,length) 184a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar return info 185a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 186a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar def getTestValues(self, t): 187a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if isinstance(t, BuiltinType): 188a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if t.name=='float': 189a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for i in ['0.0','-1.0','1.0']: 190a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar yield i+'f' 191a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elif t.name=='double': 192a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for i in ['0.0','-1.0','1.0']: 193a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar yield i 194a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elif t.name in ('void *'): 195a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar yield '(void*) 0' 196a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar yield '(void*) -1' 197a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar else: 198a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar yield '(%s) 0'%(t.name,) 199a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar yield '(%s) -1'%(t.name,) 200a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar yield '(%s) 1'%(t.name,) 201a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elif isinstance(t, RecordType): 202a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if not t.fields: 203a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar yield '{ }' 204900ed55727a5dd2a59412df00ea1513b851cd49aDaniel Dunbar return 205900ed55727a5dd2a59412df00ea1513b851cd49aDaniel Dunbar # FIXME: Use designated initializers to access non-first 206900ed55727a5dd2a59412df00ea1513b851cd49aDaniel Dunbar # fields of unions. 207900ed55727a5dd2a59412df00ea1513b851cd49aDaniel Dunbar if t.isUnion: 208900ed55727a5dd2a59412df00ea1513b851cd49aDaniel Dunbar for v in self.getTestValues(t.fields[0]): 209900ed55727a5dd2a59412df00ea1513b851cd49aDaniel Dunbar yield '{ %s }' % v 210900ed55727a5dd2a59412df00ea1513b851cd49aDaniel Dunbar return 211900ed55727a5dd2a59412df00ea1513b851cd49aDaniel Dunbar fieldValues = [list(self.getTestValues(f)) for f in t.fields] 212a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for i,values in enumerate(fieldValues): 213a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for v in values: 214a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elements = map(random.choice,fieldValues) 215a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elements[i] = v 216a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar yield '{ %s }'%(', '.join(elements)) 217a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elif isinstance(t, ComplexType): 218a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for t in self.getTestValues(t.elementType): 219550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar yield '%s + %s * 1i'%(t,t) 220550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar elif isinstance(t, ArrayType): 221a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar values = list(self.getTestValues(t.elementType)) 222a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if not values: 223a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar yield '{ }' 224550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar for i in range(t.numElements): 225a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for v in values: 226550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar elements = [random.choice(values) for i in range(t.numElements)] 227a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elements[i] = v 228a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar yield '{ %s }'%(', '.join(elements)) 229a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar else: 230a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar raise NotImplementedError,'Cannot make tests values of type: "%s"'%(t,) 231a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 2325ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar def printSizeOfType(self, prefix, name, t, output=None, indent=2): 2335ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar print >>output, '%*sprintf("%s: sizeof(%s) = %%ld\\n", sizeof(%s));'%(indent, '', prefix, name, name) 2345ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar def printAlignOfType(self, prefix, name, t, output=None, indent=2): 2355ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar print >>output, '%*sprintf("%s: __alignof__(%s) = %%ld\\n", __alignof__(%s));'%(indent, '', prefix, name, name) 2365ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar def printOffsetsOfType(self, prefix, name, t, output=None, indent=2): 2375ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar if isinstance(t, RecordType): 2385ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar for i,f in enumerate(t.fields): 2395ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar fname = 'field%d' % i 2405ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar print >>output, '%*sprintf("%s: __builtin_offsetof(%s, %s) = %%ld\\n", __builtin_offsetof(%s, %s));'%(indent, '', prefix, name, fname, name, fname) 2415ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar 242a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar def printValueOfType(self, prefix, name, t, output=None, indent=2): 243a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if output is None: 244a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar output = self.output 245a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if isinstance(t, BuiltinType): 246a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if t.name.endswith('long long'): 247a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar code = 'lld' 248a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elif t.name.endswith('long'): 249a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar code = 'ld' 250a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elif t.name.split(' ')[-1] in ('_Bool','char','short','int'): 251a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar code = 'd' 252a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elif t.name in ('float','double'): 253a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar code = 'f' 254a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elif t.name == 'long double': 255a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar code = 'Lf' 256a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar else: 257a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar code = 'p' 258a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>output, '%*sprintf("%s: %s = %%%s\\n", %s);'%(indent, '', prefix, name, code, name) 259a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elif isinstance(t, RecordType): 260a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if not t.fields: 261a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>output, '%*sprintf("%s: %s (empty)\\n");'%(indent, '', prefix, name) 262a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for i,f in enumerate(t.fields): 263a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar fname = '%s.field%d'%(name,i) 264a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.printValueOfType(prefix, fname, f, output=output, indent=indent) 265a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar elif isinstance(t, ComplexType): 266a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.printValueOfType(prefix, '(__real %s)'%name, t.elementType, output=output,indent=indent) 267a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar self.printValueOfType(prefix, '(__imag %s)'%name, t.elementType, output=output,indent=indent) 268550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar elif isinstance(t, ArrayType): 269550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar for i in range(t.numElements): 270550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar # Access in this fashion as a hackish way to portably 271550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar # access vectors. 272e61e95fdcd2bdf6293becd96c343ab3635cc4a68Daniel Dunbar if t.isVector: 273e61e95fdcd2bdf6293becd96c343ab3635cc4a68Daniel Dunbar self.printValueOfType(prefix, '((%s*) &%s)[%d]'%(t.elementType,name,i), t.elementType, output=output,indent=indent) 274e61e95fdcd2bdf6293becd96c343ab3635cc4a68Daniel Dunbar else: 275e61e95fdcd2bdf6293becd96c343ab3635cc4a68Daniel Dunbar self.printValueOfType(prefix, '%s[%d]'%(name,i), t.elementType, output=output,indent=indent) 276a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar else: 277a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar raise NotImplementedError,'Cannot print value of type: "%s"'%(t,) 278a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 2799dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar def checkTypeValues(self, nameLHS, nameRHS, t, output=None, indent=2): 2809dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar prefix = 'foo' 2819dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar if output is None: 2829dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar output = self.output 2839dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar if isinstance(t, BuiltinType): 2849dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar print >>output, '%*sassert(%s == %s);' % (indent, '', nameLHS, nameRHS) 2859dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar elif isinstance(t, RecordType): 2869dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar for i,f in enumerate(t.fields): 2879dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar self.checkTypeValues('%s.field%d'%(nameLHS,i), '%s.field%d'%(nameRHS,i), 2889dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar f, output=output, indent=indent) 2899dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar if t.isUnion: 2909dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar break 2919dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar elif isinstance(t, ComplexType): 2929dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar self.checkTypeValues('(__real %s)'%nameLHS, '(__real %s)'%nameRHS, t.elementType, output=output,indent=indent) 2939dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar self.checkTypeValues('(__imag %s)'%nameLHS, '(__imag %s)'%nameRHS, t.elementType, output=output,indent=indent) 2949dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar elif isinstance(t, ArrayType): 2959dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar for i in range(t.numElements): 2969dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar # Access in this fashion as a hackish way to portably 2979dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar # access vectors. 2989dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar if t.isVector: 2999dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar self.checkTypeValues('((%s*) &%s)[%d]'%(t.elementType,nameLHS,i), 3009dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar '((%s*) &%s)[%d]'%(t.elementType,nameRHS,i), 3019dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar t.elementType, output=output,indent=indent) 3029dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar else: 3039dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar self.checkTypeValues('%s[%d]'%(nameLHS,i), '%s[%d]'%(nameRHS,i), 3049dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar t.elementType, output=output,indent=indent) 3059dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar else: 3069dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar raise NotImplementedError,'Cannot print value of type: "%s"'%(t,) 3079dd60b4526ccfab13cf0976999bf5f90b3423f43Daniel Dunbar 308a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbarimport sys 309a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 310a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbardef main(): 311a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar from optparse import OptionParser, OptionGroup 312a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar parser = OptionParser("%prog [options] {indices}") 313a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar parser.add_option("", "--mode", dest="mode", 314a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="autogeneration mode (random or linear) [default %default]", 315a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar type='choice', choices=('random','linear'), default='linear') 316a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar parser.add_option("", "--count", dest="count", 317a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="autogenerate COUNT functions according to MODE", 318a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar type=int, default=0) 319a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar parser.add_option("", "--min", dest="minIndex", metavar="N", 320a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="start autogeneration with the Nth function type [default %default]", 321a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar type=int, default=0) 322a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar parser.add_option("", "--max", dest="maxIndex", metavar="N", 323a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="maximum index for random autogeneration [default %default]", 324a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar type=int, default=10000000) 325a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar parser.add_option("", "--seed", dest="seed", 326a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="random number generator seed [default %default]", 327a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar type=int, default=1) 328a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar parser.add_option("", "--use-random-seed", dest="useRandomSeed", 329a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="use random value for initial random number generator seed", 330a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action='store_true', default=False) 331a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar parser.add_option("-o", "--output", dest="output", metavar="FILE", 332a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="write output to FILE [default %default]", 333a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar type=str, default='-') 334a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar parser.add_option("-O", "--output-header", dest="outputHeader", metavar="FILE", 335a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="write header file for output to FILE [default %default]", 336a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar type=str, default=None) 337a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar parser.add_option("-T", "--output-tests", dest="outputTests", metavar="FILE", 338a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="write function tests to FILE [default %default]", 339a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar type=str, default=None) 340a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar parser.add_option("-D", "--output-driver", dest="outputDriver", metavar="FILE", 341a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="write test driver to FILE [default %default]", 342a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar type=str, default=None) 3435ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar parser.add_option("", "--test-layout", dest="testLayout", metavar="FILE", 3445ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar help="test structure layout", 3455ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar action='store_true', default=False) 346a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 347a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group = OptionGroup(parser, "Type Enumeration Options") 348a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar # Builtins - Ints 349a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-char", dest="useChar", 350a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate char types", 351a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 352a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-short", dest="useShort", 353a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate short types", 354a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 355a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-int", dest="useInt", 356a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate int types", 357a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 358a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-long", dest="useLong", 359a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate long types", 360a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 361a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-long-long", dest="useLongLong", 362a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate long long types", 363a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 364a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-unsigned", dest="useUnsigned", 365a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate unsigned integer types", 366a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 367a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 368a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar # Other builtins 369a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-bool", dest="useBool", 370a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate bool types", 371a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 372a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-float", dest="useFloat", 373a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate float types", 374a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 375a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-double", dest="useDouble", 376a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate double types", 377a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 378a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-long-double", dest="useLongDouble", 379a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate long double types", 380a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 381a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-void-pointer", dest="useVoidPointer", 382a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate void* types", 383a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 384a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 385a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar # Derived types 386a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-array", dest="useArray", 387a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate record types", 388a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 389a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-complex", dest="useComplex", 390a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate complex types", 391a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 392a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-record", dest="useRecord", 393a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate record types", 394a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 395a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-union", dest="recordUseUnion", 396a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate union types", 397a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 398a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-vector", dest="useVector", 399a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate vector types", 400a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 401a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 402a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar # Tuning 403a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--no-function-return", dest="functionUseReturn", 404a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="do not generate return types for functions", 405a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store_false", default=True) 4060f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar group.add_option("", "--vector-types", dest="vectorTypes", 4070f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar help="comma separated list of vector types (e.g., v2i32) [default %default]", 408ec1abb9bd70f67a0a93bb5c9ffeafc184cb551d0Daniel Dunbar action="store", type=str, default='v2i16, v1i64, v2i32, v4i16, v8i8, v2f32, v2i64, v4i32, v8i16, v16i8, v2f64, v4f32, v16f32', metavar="N") 409a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 410a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--max-args", dest="functionMaxArgs", 411a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="maximum number of arguments per function [default %default]", 412a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store", type=int, default=4, metavar="N") 413a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--max-array", dest="arrayMaxSize", 414a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="maximum array size [default %default]", 415a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store", type=int, default=4, metavar="N") 416a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--max-record", dest="recordMaxSize", 417a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="maximum number of fields per record [default %default]", 418a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store", type=int, default=4, metavar="N") 419a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar group.add_option("", "--max-record-depth", dest="recordMaxDepth", 420a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar help="maximum nested structure depth [default %default]", 421a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar action="store", type=int, default=None, metavar="N") 422a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar parser.add_option_group(group) 423a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar (opts, args) = parser.parse_args() 424a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 425a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if not opts.useRandomSeed: 426a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar random.seed(opts.seed) 427a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 428a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar # Contruct type generator 429a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar builtins = [] 430a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar ints = [] 431550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar if opts.useChar: ints.append(('char',1)) 432550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar if opts.useShort: ints.append(('short',2)) 433550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar if opts.useInt: ints.append(('int',4)) 434550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar # FIXME: Wrong size. 435550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar if opts.useLong: ints.append(('long',4)) 436550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar if opts.useLongLong: ints.append(('long long',8)) 437a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if opts.useUnsigned: 438550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar ints = ([('unsigned %s'%i,s) for i,s in ints] + 439550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar [('signed %s'%i,s) for i,s in ints]) 440a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar builtins.extend(ints) 441a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 442550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar if opts.useBool: builtins.append(('_Bool',1)) 443550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar if opts.useFloat: builtins.append(('float',4)) 444550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar if opts.useDouble: builtins.append(('double',8)) 445550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar if opts.useLongDouble: builtins.append(('long double',16)) 446550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar # FIXME: Wrong size. 447550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar if opts.useVoidPointer: builtins.append(('void*',4)) 448a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 449550faa3a6bb394eaa4013fcff0582434f4e924afDaniel Dunbar btg = FixedTypeGenerator([BuiltinType(n,s) for n,s in builtins]) 4500f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar charType = BuiltinType('char',1) 4510f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar shortType = BuiltinType('short',2) 4520f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar intType = BuiltinType('int',4) 4530f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar longlongType = BuiltinType('long long',8) 4540f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar floatType = BuiltinType('float',4) 4550f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar doubleType = BuiltinType('double',8) 4560f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar sbtg = FixedTypeGenerator([charType, intType, floatType, doubleType]) 457a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 458a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar atg = AnyTypeGenerator() 459a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar artg = AnyTypeGenerator() 460a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar def makeGenerator(atg, subgen, useRecord, useArray): 461a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar atg.addGenerator(btg) 462a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if useRecord and opts.useRecord: 463a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar assert subgen 464a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar atg.addGenerator(RecordTypeGenerator(subgen, opts.recordUseUnion, 465a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar opts.recordMaxSize)) 466a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if opts.useComplex: 467a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar # FIXME: Allow overriding builtins here 468a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar atg.addGenerator(ComplexTypeGenerator(sbtg)) 469a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if useArray and opts.useArray: 470a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar assert subgen 471a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar atg.addGenerator(ArrayTypeGenerator(subgen, opts.arrayMaxSize)) 472a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if opts.useVector: 4730f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar vTypes = [] 4740f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar for i,t in enumerate(opts.vectorTypes.split(',')): 4750f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar m = re.match('v([1-9][0-9]*)([if][1-9][0-9]*)', t.strip()) 4760f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar if not m: 4770f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar parser.error('Invalid vector type: %r' % t) 4780f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar count,kind = m.groups() 4790f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar count = int(count) 4800f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar type = { 'i8' : charType, 4810f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar 'i16' : shortType, 4820f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar 'i32' : intType, 4830f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar 'i64' : longlongType, 4840f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar 'f32' : floatType, 4850f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar 'f64' : doubleType, 4860f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar }.get(kind) 4870f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar if not type: 4880f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar parser.error('Invalid vector type: %r' % t) 4890f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar vTypes.append(ArrayType(i, True, type, count * type.size)) 4900f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar 4910f1730d220cb76a90159a42acd050c4d44dc18d8Daniel Dunbar atg.addGenerator(FixedTypeGenerator(vTypes)) 492a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 493a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if opts.recordMaxDepth is None: 494a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar # Fully recursive, just avoid top-level arrays. 495a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar subTG = AnyTypeGenerator() 496a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar atg = AnyTypeGenerator() 497a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar makeGenerator(subTG, atg, True, True) 498a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar makeGenerator(atg, subTG, True, False) 499a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar else: 500a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar # Make a chain of type generators, each builds smaller 501a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar # structures. 502a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar base = AnyTypeGenerator() 503a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar makeGenerator(base, None, False, False) 504a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for i in range(opts.recordMaxDepth): 505a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar n = AnyTypeGenerator() 506a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar makeGenerator(n, base, True, True) 507a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar base = n 508a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar atg = AnyTypeGenerator() 509a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar makeGenerator(atg, base, True, False) 510a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 5115ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar if opts.testLayout: 5125ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar ftg = atg 5135ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar else: 5145ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar ftg = FunctionTypeGenerator(atg, opts.functionUseReturn, opts.functionMaxArgs) 515a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 516a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar # Override max,min,count if finite 517a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if opts.maxIndex is None: 518a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if ftg.cardinality is aleph0: 519a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar opts.maxIndex = 10000000 520a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar else: 521a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar opts.maxIndex = ftg.cardinality 522a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar opts.maxIndex = min(opts.maxIndex, ftg.cardinality) 523a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar opts.minIndex = max(0,min(opts.maxIndex-1, opts.minIndex)) 524a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if not opts.mode=='random': 525a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar opts.count = min(opts.count, opts.maxIndex-opts.minIndex) 526a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 527a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if opts.output=='-': 528a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar output = sys.stdout 529a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar else: 530a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar output = open(opts.output,'w') 531a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar atexit.register(lambda: output.close()) 532a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 533a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar outputHeader = None 534a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if opts.outputHeader: 535a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar outputHeader = open(opts.outputHeader,'w') 536a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar atexit.register(lambda: outputHeader.close()) 537a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 538a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar outputTests = None 539a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if opts.outputTests: 540a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar outputTests = open(opts.outputTests,'w') 541a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar atexit.register(lambda: outputTests.close()) 542a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 543a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar outputDriver = None 544a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if opts.outputDriver: 545a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar outputDriver = open(opts.outputDriver,'w') 546a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar atexit.register(lambda: outputDriver.close()) 547a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 548a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar info = '' 549a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar info += '// %s\n'%(' '.join(sys.argv),) 550a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar info += '// Generated: %s\n'%(time.strftime('%Y-%m-%d %H:%M'),) 551a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar info += '// Cardinality of function generator: %s\n'%(ftg.cardinality,) 552a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar info += '// Cardinality of type generator: %s\n'%(atg.cardinality,) 5535ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar 5545ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar if opts.testLayout: 5555ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar info += '\n#include <stdio.h>' 556a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 557a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar P = TypePrinter(output, 558a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar outputHeader=outputHeader, 559a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar outputTests=outputTests, 560a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar outputDriver=outputDriver, 5615ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar headerName=opts.outputHeader, 562a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar info=info) 563a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 564a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar def write(N): 5655ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar try: 566a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar FT = ftg.get(N) 567a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar except RuntimeError,e: 568a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if e.args[0]=='maximum recursion depth exceeded': 569a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar print >>sys.stderr,'WARNING: Skipped %d, recursion limit exceeded (bad arguments?)'%(N,) 570a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar return 571a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar raise 5725ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar if opts.testLayout: 5735ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar P.writeLayoutTest(N, FT) 5745ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar else: 5755ce61575adde60a826576446d2e9e953c54e1e99Daniel Dunbar P.writeFunction(N, FT) 576a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 577a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if args: 578a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar [write(int(a)) for a in args] 579a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 580a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar for i in range(opts.count): 581a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar if opts.mode=='linear': 582a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar index = opts.minIndex + i 583a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar else: 584a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar index = opts.minIndex + int((opts.maxIndex-opts.minIndex) * random.random()) 585a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar write(index) 586a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 587a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar P.finish() 588a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 589a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbarif __name__=='__main__': 590a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar main() 591a83fb8647bfca3aa9bd7049f817979f092244e83Daniel Dunbar 592