| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- import os.path
- import numpy as np
- import itertools
- import Tools
- # Those patterns are used for tests and benchmarks.
- # For tests, there is the need to add tests for saturation
- def clipTest(config,format,nb):
- NBSAMPLESBASE=256
- #config.setOverwrite(True)
- minValues=[-0.5,-0.5,0.1]
- maxValues=[-0.1, 0.5,0.5]
- nbSamples=[NBSAMPLESBASE+Tools.loopnb(format,Tools.TAILONLY)
- ,NBSAMPLESBASE+Tools.loopnb(format,Tools.BODYONLY)
- ,NBSAMPLESBASE+Tools.loopnb(format,Tools.BODYANDTAIL)
- ]
- maxLength = max(nbSamples)
- minBound=-0.9
- maxBound=0.9
- testSamples=np.linspace(minBound,maxBound,maxLength)
- config.writeInput(nb, testSamples)
- i=0
- for (mi,ma,nbForTest) in zip(minValues,maxValues,nbSamples):
- ref = list(np.clip(testSamples[0:nbForTest],mi,ma))
- config.writeReference(nb+i, ref)
- i = i + 1
-
-
-
- #config.setOverwrite(False)
- return(i)
- def writeTests(config,format):
- NBSAMPLES=256
- data1=np.random.randn(NBSAMPLES)
- data2=np.random.randn(NBSAMPLES)
- data3=np.random.randn(1)
-
- data1 = Tools.normalize(data1)
- data2 = Tools.normalize(data2)
- # temp for debug of f16
- config.writeInput(1, data1)
- config.writeInput(2, data2)
-
- ref = data1 + data2
- config.writeReference(1, ref)
-
- ref = data1 - data2
- config.writeReference(2, ref)
-
- ref = data1 * data2
- config.writeReference(3, ref)
-
- ref = -data1
- config.writeReference(4, ref)
-
- ref = data1 + 0.5
- config.writeReference(5, ref)
-
- ref = data1 * 0.5
- config.writeReference(6, ref)
-
-
-
- nb = Tools.loopnb(format,Tools.TAILONLY)
- ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])])
- if format == 31 or format == 15:
- if format==31:
- ref = ref / 2**15 # Because CMSIS format is 16.48
- if format==15:
- ref = ref / 2**33 # Because CMSIS format is 34.30
- config.writeReferenceQ63(7, ref)
- elif format == 7:
- ref = ref / 2**17 # Because CMSIS format is 18.14
- config.writeReferenceQ31(7, ref)
- else:
- config.writeReference(7, ref)
-
- nb = Tools.loopnb(format,Tools.BODYONLY)
- ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])])
- if format == 31 or format == 15:
- if format==31:
- ref = ref / 2**15 # Because CMSIS format is 16.48
- if format==15:
- ref = ref / 2**33 # Because CMSIS format is 34.30
- config.writeReferenceQ63(8, ref)
- elif format == 7:
- ref = ref / 2**17 # Because CMSIS format is 18.14
- config.writeReferenceQ31(8, ref)
- else:
- config.writeReference(8, ref)
-
- nb = Tools.loopnb(format,Tools.BODYANDTAIL)
- ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])])
- if format == 31 or format == 15:
- if format==31:
- ref = ref / 2**15 # Because CMSIS format is 16.48
- if format==15:
- ref = ref / 2**33 # Because CMSIS format is 34.30
- config.writeReferenceQ63(9, ref)
- elif format == 7:
- ref = ref / 2**17 # Because CMSIS format is 18.14
- config.writeReferenceQ31(9, ref)
- else:
- config.writeReference(9, ref)
-
- ref = abs(data1)
- config.writeReference(10, ref)
- ref = np.array([np.dot(data1 ,data2)])
- if format == 31 or format == 15:
- if format==31:
- ref = ref / 2**15 # Because CMSIS format is 16.48
- if format==15:
- ref = ref / 2**33 # Because CMSIS format is 34.30
- config.writeReferenceQ63(11, ref)
- elif format == 7:
- ref = ref / 2**17 # Because CMSIS format is 18.14
- config.writeReferenceQ31(11, ref)
- else:
- config.writeReference(11, ref)
- # This function is used in other test functions for q31 and q15
- # So we can't add tests here for q15 and q31.
- # But we can for f32:
- if format == Tools.F64 or format == Tools.F32 or format==Tools.F16:
- clipTest(config,format,12)
- return(13)
- return(11)
- def writeTestsWithSat(config,format):
- if format == 31:
- NBSAMPLES=9
- if format == 15:
- NBSAMPLES=17
- if format == 7:
- NBSAMPLES=33
- nb = writeTests(config,format)
-
- data1 = np.full(NBSAMPLES, 2**format - 1)
- data1[1::2] = 2
- data2 = np.full(NBSAMPLES, -2**format)
- data2[1::2] = -2
- datar=np.random.randn(NBSAMPLES)
- datar = Tools.normalize(datar)
- datar = datar / 3.0 # Because used to test shift of 2 without saturation
- config.writeInput(nb+1, datar)
- if format == 31:
- config.writeInputS32(nb+1,data1-1,"MaxPosInput")
- config.writeInputS32(nb+1,data2+1,"MaxNegInput")
- config.writeInputS32(nb+1,data2,"MaxNeg2Input")
- if format == 15:
- config.writeInputS16(nb+1,data1-1,"MaxPosInput")
- config.writeInputS16(nb+1,data2+1,"MaxNegInput")
- config.writeInputS16(nb+1,data2,"MaxNeg2Input")
- if format == 7:
- config.writeInputS8(nb+1,data1-1,"MaxPosInput")
- config.writeInputS8(nb+1,data2+1,"MaxNegInput")
- config.writeInputS8(nb+1,data2,"MaxNeg2Input")
-
- d1 = 1.0*(data1-1) / 2**format
- d2 = 1.0*(data2+1) / 2**format
- d3 = 1.0*(data2) / 2**format
- ref = d1 + d1
- config.writeReference(nb+1, ref,"PosSat")
- ref = d2 + d2
- config.writeReference(nb+2, ref,"NegSat")
- d1 = 1.0*(data1-1) / 2**format
- d2 = 1.0*(data2+1) / 2**format
- ref = d1 - d2
- config.writeReference(nb+3, ref,"PosSat")
- ref = d2 - d1
- config.writeReference(nb+4, ref,"NegSat")
- ref = d3*d3
- config.writeReference(nb+5, ref,"PosSat")
- ref = -d3
- config.writeReference(nb+6, ref,"PosSat")
- ref = d1 + 0.9
- config.writeReference(nb+7, ref,"PosSat")
- ref = d2 - 0.9
- config.writeReference(nb+8, ref,"NegSat")
- ref = d3 * d3[0]
- config.writeReference(nb+9, ref,"PosSat")
- ref = datar * 2.0
- config.writeReference(nb+10, ref,"Shift")
- ref = d1 * 2.0
- config.writeReference(nb+11, ref,"Shift")
- ref = d2 * 2.0
- config.writeReference(nb+12, ref,"Shift")
- return(nb+13)
- def writeTests2(config,format):
- NBSAMPLES = Tools.loopnb(format,Tools.BODYANDTAIL)
- nb = writeTestsWithSat(config,format)
- if format == 31:
- maxVal = 0x7fffffff
- if format == 15:
- maxVal = 0x7fff
- if format == 7:
- maxVal = 0x7f
- minVal = -maxVal-1
- data1 = np.random.randint(minVal, maxVal, size=NBSAMPLES)
- data2 = np.random.randint(minVal, maxVal, size=NBSAMPLES)
- if format == 31:
- config.writeInputS32(nb,data1,"BitwiseInput")
- config.writeInputS32(nb+1,data2,"BitwiseInput")
- if format == 15:
- config.writeInputS16(nb,data1,"BitwiseInput")
- config.writeInputS16(nb+1,data2,"BitwiseInput")
- if format == 7:
- config.writeInputS8(nb,data1,"BitwiseInput")
- config.writeInputS8(nb+1,data2,"BitwiseInput")
- ref = np.bitwise_and(data1, data2)
- if format == 31:
- config.writeReferenceS32(nb, ref, "And")
- if format == 15:
- config.writeReferenceS16(nb, ref, "And")
- if format == 7:
- config.writeReferenceS8(nb, ref, "And")
- ref = np.bitwise_or(data1, data2)
- if format == 31:
- config.writeReferenceS32(nb+1, ref, "Or")
- if format == 15:
- config.writeReferenceS16(nb+1, ref, "Or")
- if format == 7:
- config.writeReferenceS8(nb+1, ref, "Or")
- ref = np.invert(data1)
- if format == 31:
- config.writeReferenceS32(nb+2, ref, "Not")
- if format == 15:
- config.writeReferenceS16(nb+2, ref, "Not")
- if format == 7:
- config.writeReferenceS8(nb+2, ref, "Not")
- ref = np.bitwise_xor(data1, data2)
- if format == 31:
- config.writeReferenceS32(nb+3, ref, "Xor")
- if format == 15:
- config.writeReferenceS16(nb+3, ref, "Xor")
- if format == 7:
- config.writeReferenceS8(nb+3, ref, "Xor")
- clipTest(config,format,nb+4)
- def generatePatterns():
- PATTERNDIR = os.path.join("Patterns","DSP","BasicMaths","BasicMaths")
- PARAMDIR = os.path.join("Parameters","DSP","BasicMaths","BasicMaths")
-
- configf64=Tools.Config(PATTERNDIR,PARAMDIR,"f64")
- configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
- configf16=Tools.Config(PATTERNDIR,PARAMDIR,"f16")
- configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31")
- configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15")
- configq7=Tools.Config(PATTERNDIR,PARAMDIR,"q7")
- configf32.setOverwrite(False)
- configf16.setOverwrite(False)
- configq31.setOverwrite(False)
- configq15.setOverwrite(False)
- configq7.setOverwrite(False)
-
- writeTests(configf64,Tools.F64)
- writeTests(configf32,0)
- writeTests(configf16,16)
- writeTests2(configq31,31)
- writeTests2(configq15,15)
- writeTests2(configq7,7)
- # Params just as example
- someLists=[[1,3,5],[1,3,5],[1,3,5]]
-
- r=np.array([element for element in itertools.product(*someLists)])
- configf32.writeParam(1, r.reshape(81))
- if __name__ == '__main__':
- generatePatterns()
|