Skip to content

Commit cb7a7ac

Browse files
mgumblestrainmike
authored andcommitted
Fifo and array fxp bitfile tests (#17)
No longer throwing exception if a bitfile is used that contains FXP Arrays or FIFOs.
1 parent b45bcdb commit cb7a7ac

File tree

3 files changed

+339
-4
lines changed

3 files changed

+339
-4
lines changed

nifpga/bitfile.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,16 @@ def __init__(self, filepath, parse_contents=False):
3232
if reg.datatype is not None:
3333
assert reg.name not in self._registers, \
3434
"One or more registers have the same name '%s', this is not supported" % reg.name
35-
self._registers[reg.name] = reg
35+
# We don't yet support FXP Arrays
36+
if not (reg.is_array() and reg.datatype is DataType.Fxp):
37+
self._registers[reg.name] = reg
3638

3739
self._fifos = {}
3840
for channel_xml in nifpga.find("DmaChannelAllocationList"):
39-
fifo = Fifo(channel_xml)
40-
self._fifos[fifo.name] = fifo
41+
""" The Python API does not yet support FXP Fifos. """
42+
if not self._is_fifo_fxp(channel_xml):
43+
fifo = Fifo(channel_xml)
44+
self._fifos[fifo.name] = fifo
4145

4246
@property
4347
def filepath(self):
@@ -79,11 +83,19 @@ def create_register(self, xml):
7983

8084
def _is_register_fxp(self, reg_xml):
8185
datatype = reg_xml.find("Datatype")
86+
if datatype.find("Array") is not None:
87+
datatype = datatype.find("Array").find("Type")
8288
for child in datatype.getchildren():
8389
if str(DataType.Fxp).lower() not in child.tag.lower():
8490
return False
8591
return True
8692

93+
def _is_fifo_fxp(self, channel_xml):
94+
datatype = channel_xml.find("DataType").find("SubType").text.title()
95+
if str(DataType.Fxp).lower() not in datatype.lower():
96+
return False
97+
return True
98+
8799

88100
class Register(object):
89101
def __init__(self, reg_xml):
@@ -192,7 +204,10 @@ class FxpRegister(Register):
192204
def __init__(self, reg_xml):
193205
super(FxpRegister, self).__init__(reg_xml)
194206
datatype = reg_xml.find("Datatype")
195-
fxp_xml = datatype.find("FXP")
207+
if self.is_array():
208+
fxp_xml = datatype.find("Array").find("Type").find("FXP")
209+
else:
210+
fxp_xml = datatype.find("FXP")
196211
self._signed = True if fxp_xml.find("Signed").text.lower() == 'true' else False
197212
self._overflow = True if fxp_xml.find("IncludeOverflowStatus").text.lower() == 'true' else False
198213
self._word_length = int(fxp_xml.find("WordLength").text)

nifpga/tests/FXPTypes.lvbitx

Lines changed: 307 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,307 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<Bitfile>
3+
<BitfileVersion>4.0</BitfileVersion>
4+
<Documentation>
5+
<BuildSpecVersion/>
6+
<BuildSpecDescription/>
7+
</Documentation>
8+
<SignatureRegister>39A495BE1F50EBAD3669482C7AB9FDEE</SignatureRegister>
9+
<SignatureGuids>4806C62DB55A688314FD669DD9340117</SignatureGuids>
10+
<SignatureNames>3DBDEAA0EC19A360DCCEE3424D105993</SignatureNames>
11+
<TimeStamp/>
12+
<CompilationStatus/>
13+
<BitstreamVersion>2</BitstreamVersion>
14+
<VI>
15+
<Name>FXP Types.vi</Name>
16+
<RegisterList>
17+
<Register>
18+
<Name>FXP Array</Name>
19+
<Hidden>false</Hidden>
20+
<Indicator>true</Indicator>
21+
<Datatype>
22+
<Array>
23+
<Name>FXP Array</Name>
24+
<Size>1</Size>
25+
<Type>
26+
<FXP>
27+
<Name>FXP</Name>
28+
<Signed>true</Signed>
29+
<WordLength>16</WordLength>
30+
<IntegerWordLength>16</IntegerWordLength>
31+
<Minimum>-32768.000000</Minimum>
32+
<Maximum>32767.000000</Maximum>
33+
<Delta>1.000000</Delta>
34+
<IncludeOverflowStatus>false</IncludeOverflowStatus>
35+
</FXP>
36+
</Type>
37+
</Array>
38+
</Datatype>
39+
<FlattenedType>13008000000000020040405F03510010000000100001000100000010FFFFFFFFFFFFFFFF0000000F0000000F0000000000007FFF0000000100000001000000000000000103465850001640400001800000010000094658502041727261790001000100000001000000000000000000000000</FlattenedType>
40+
<Grouping/>
41+
<Offset>98306</Offset>
42+
<SizeInBits>16</SizeInBits>
43+
<Class>14</Class>
44+
<Internal>false</Internal>
45+
<TypedefPath/>
46+
<TypedefRelativePath/>
47+
<ID>1</ID>
48+
<Bidirectional>true</Bidirectional>
49+
<Synchronous>false</Synchronous>
50+
<MechanicalAction>Switch When Pressed</MechanicalAction>
51+
<AccessMayTimeout>false</AccessMayTimeout>
52+
<RegisterNode>false</RegisterNode>
53+
<SubControlList/>
54+
</Register>
55+
<Register>
56+
<Name>FXP indicator</Name>
57+
<Hidden>false</Hidden>
58+
<Indicator>true</Indicator>
59+
<Datatype>
60+
<FXP>
61+
<Name>FXP indicator</Name>
62+
<Signed>true</Signed>
63+
<WordLength>16</WordLength>
64+
<IntegerWordLength>16</IntegerWordLength>
65+
<Minimum>-32768.000000</Minimum>
66+
<Maximum>32767.000000</Maximum>
67+
<Delta>1.000000</Delta>
68+
<IncludeOverflowStatus>false</IncludeOverflowStatus>
69+
</FXP>
70+
</Datatype>
71+
<FlattenedType>1300800000000001004A405F03510010000000100001000100000010FFFFFFFFFFFFFFFF0000000F0000000F0000000000007FFF000000010000000100000000000000010D46585020696E64696361746F7200010000000000000000000000000000</FlattenedType>
72+
<Grouping/>
73+
<Offset>98310</Offset>
74+
<SizeInBits>16</SizeInBits>
75+
<Class>18</Class>
76+
<Internal>false</Internal>
77+
<TypedefPath/>
78+
<TypedefRelativePath/>
79+
<ID>0</ID>
80+
<Bidirectional>true</Bidirectional>
81+
<Synchronous>false</Synchronous>
82+
<MechanicalAction>Switch When Pressed</MechanicalAction>
83+
<AccessMayTimeout>false</AccessMayTimeout>
84+
<RegisterNode>false</RegisterNode>
85+
<SubControlList/>
86+
</Register>
87+
<Register>
88+
<Name>ViSignature</Name>
89+
<Hidden>true</Hidden>
90+
<Indicator>true</Indicator>
91+
<Datatype>
92+
<Array>
93+
<Name/>
94+
<Size>4</Size>
95+
<Type>
96+
<U32>
97+
<Name/>
98+
</U32>
99+
</Type>
100+
</Array>
101+
</Datatype>
102+
<FlattenedType/>
103+
<Grouping/>
104+
<Offset>94212</Offset>
105+
<SizeInBits>128</SizeInBits>
106+
<Class>0</Class>
107+
<Internal>true</Internal>
108+
<TypedefPath/>
109+
<TypedefRelativePath/>
110+
<ID>0</ID>
111+
<Bidirectional>false</Bidirectional>
112+
<Synchronous>false</Synchronous>
113+
<MechanicalAction>Switch When Pressed</MechanicalAction>
114+
<AccessMayTimeout>false</AccessMayTimeout>
115+
<RegisterNode>false</RegisterNode>
116+
<SubControlList/>
117+
</Register>
118+
<Register>
119+
<Name>DiagramReset</Name>
120+
<Hidden>false</Hidden>
121+
<Indicator>false</Indicator>
122+
<Datatype>
123+
<U32>
124+
<Name/>
125+
</U32>
126+
</Datatype>
127+
<FlattenedType/>
128+
<Grouping/>
129+
<Offset>94216</Offset>
130+
<SizeInBits>32</SizeInBits>
131+
<Class>0</Class>
132+
<Internal>true</Internal>
133+
<TypedefPath/>
134+
<TypedefRelativePath/>
135+
<ID>0</ID>
136+
<Bidirectional>true</Bidirectional>
137+
<Synchronous>false</Synchronous>
138+
<MechanicalAction>Switch When Pressed</MechanicalAction>
139+
<AccessMayTimeout>false</AccessMayTimeout>
140+
<RegisterNode>false</RegisterNode>
141+
<SubControlList/>
142+
</Register>
143+
<Register>
144+
<Name>ViControl</Name>
145+
<Hidden>false</Hidden>
146+
<Indicator>false</Indicator>
147+
<Datatype>
148+
<U32>
149+
<Name/>
150+
</U32>
151+
</Datatype>
152+
<FlattenedType/>
153+
<Grouping/>
154+
<Offset>94208</Offset>
155+
<SizeInBits>32</SizeInBits>
156+
<Class>0</Class>
157+
<Internal>true</Internal>
158+
<TypedefPath/>
159+
<TypedefRelativePath/>
160+
<ID>0</ID>
161+
<Bidirectional>true</Bidirectional>
162+
<Synchronous>false</Synchronous>
163+
<MechanicalAction>Switch When Pressed</MechanicalAction>
164+
<AccessMayTimeout>false</AccessMayTimeout>
165+
<RegisterNode>false</RegisterNode>
166+
<SubControlList/>
167+
</Register>
168+
<Register>
169+
<Name>InterruptEnable</Name>
170+
<Hidden>false</Hidden>
171+
<Indicator>false</Indicator>
172+
<Datatype>
173+
<U32>
174+
<Name/>
175+
</U32>
176+
</Datatype>
177+
<FlattenedType/>
178+
<Grouping/>
179+
<Offset>90112</Offset>
180+
<SizeInBits>32</SizeInBits>
181+
<Class>0</Class>
182+
<Internal>true</Internal>
183+
<TypedefPath/>
184+
<TypedefRelativePath/>
185+
<ID>0</ID>
186+
<Bidirectional>true</Bidirectional>
187+
<Synchronous>false</Synchronous>
188+
<MechanicalAction>Switch When Pressed</MechanicalAction>
189+
<AccessMayTimeout>false</AccessMayTimeout>
190+
<RegisterNode>false</RegisterNode>
191+
<SubControlList/>
192+
</Register>
193+
<Register>
194+
<Name>InterruptMask</Name>
195+
<Hidden>false</Hidden>
196+
<Indicator>false</Indicator>
197+
<Datatype>
198+
<U32>
199+
<Name/>
200+
</U32>
201+
</Datatype>
202+
<FlattenedType/>
203+
<Grouping/>
204+
<Offset>90120</Offset>
205+
<SizeInBits>32</SizeInBits>
206+
<Class>0</Class>
207+
<Internal>true</Internal>
208+
<TypedefPath/>
209+
<TypedefRelativePath/>
210+
<ID>0</ID>
211+
<Bidirectional>true</Bidirectional>
212+
<Synchronous>false</Synchronous>
213+
<MechanicalAction>Switch When Pressed</MechanicalAction>
214+
<AccessMayTimeout>false</AccessMayTimeout>
215+
<RegisterNode>false</RegisterNode>
216+
<SubControlList/>
217+
</Register>
218+
<Register>
219+
<Name>InterruptStatus</Name>
220+
<Hidden>false</Hidden>
221+
<Indicator>false</Indicator>
222+
<Datatype>
223+
<U32>
224+
<Name/>
225+
</U32>
226+
</Datatype>
227+
<FlattenedType/>
228+
<Grouping/>
229+
<Offset>90124</Offset>
230+
<SizeInBits>32</SizeInBits>
231+
<Class>0</Class>
232+
<Internal>true</Internal>
233+
<TypedefPath/>
234+
<TypedefRelativePath/>
235+
<ID>0</ID>
236+
<Bidirectional>true</Bidirectional>
237+
<Synchronous>false</Synchronous>
238+
<MechanicalAction>Switch When Pressed</MechanicalAction>
239+
<AccessMayTimeout>false</AccessMayTimeout>
240+
<RegisterNode>false</RegisterNode>
241+
<SubControlList/>
242+
</Register>
243+
</RegisterList>
244+
<Icon>
245+
<ImageType>0</ImageType>
246+
<ImageDepth>8</ImageDepth>
247+
<Image>////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA/////////////////////////wAAAAAAAAAAAP//AAD/+fn5+fn5+fn5+fn59/ks+SzgAAAAAAAAAAAA//8AAP/5///////////////3+Sz5LP8AAAAAAAAAAAD//wAA//n/6OTo////6OTo//f8K/ws/wAAAAAAAAAAAP//AAD/+f/k/+T////k/+T/9ywsLCzgAAAAAAAAAAAA//8AAP/56OT/5Oj/6OT/5Oj3K/wrLP8AAAAAAAAAAAD//wAA//nk6P/o5P/k6P/o5Pf8CPws/wAAAAAAAAAAAP//AAD/+eT////k/+T////k9/wI/Cz/AAAAAAAAAAAA//8AAP/5/////+jk6P/////3K/wrLP8AAAAAAAAAAAD//wAA//n///////////////csLCws/wAAAAAAAAAAAP//AAD/9/f39/f39/f39/f39ywsg4P/AAAAAAAAAAAA//8AAP8sLCwsLCwsLCwsLCwsLCyDBYODAAAAAAAAAAD//wAA/yz8LCwsLCz8LCwsLCMjI4MFBQWDgwAAAAAAAP//AAD//PD8LCws/CP8LCMjLCwsgwUF/wUFg4MAAAAA//8AAP8s7ywsLCwjLCwjLCwsLCyDBf///wUFBYMjIwD//wAA///w////I///I////////4MFBf8FBYODAAAAAP//AAAAAO8AAAAjAAAjAADw7+/wgwUFBYODAAAAAAAA//8AAAAAAPAAAAAjIwAA7wAAAACDBYODAAAAAAAAAAD//wAAAAAAAO/vAAAAAPAAAAAAAIODAAAAAAAAAAAAAP//AAAAAAAAAADw7/DvAAAAAAAAAAAAAAAAAP8AAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////////w==</Image>
248+
<Mask>//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8=</Mask>
249+
<Colors>AP///wD//8wA//+ZAP//ZgD//zMA//8AAP/M/wD/zMwA/8yZAP/MZgD/zDMA/8wAAP+Z/wD/mcwA/5mZAP+ZZgD/mTMA/5kAAP9m/wD/ZswA/2aZAP9mZgD/ZjMA/2YAAP8z/wD/M8wA/zOZAP8zZgD/MzMA/zMAAP8A/wD/AMwA/wCZAP8AZgD/ADMA/wAAAMz//wDM/8wAzP+ZAMz/ZgDM/zMAzP8AAMzM/wDMzMwAzMyZAMzMZgDMzDMAzMwAAMyZ/wDMmcwAzJmZAMyZZgDMmTMAzJkAAMxm/wDMZswAzGaZAMxmZgDMZjMAzGYAAMwz/wDMM8wAzDOZAMwzZgDMMzMAzDMAAMwA/wDMAMwAzACZAMwAZgDMADMAzAAAAJn//wCZ/8wAmf+ZAJn/ZgCZ/zMAmf8AAJnM/wCZzMwAmcyZAJnMZgCZzDMAmcwAAJmZ/wCZmcwAmZmZAJmZZgCZmTMAmZkAAJlm/wCZZswAmWaZAJlmZgCZZjMAmWYAAJkz/wCZM8wAmTOZAJkzZgCZMzMAmTMAAJkA/wCZAMwAmQCZAJkAZgCZADMAmQAAAGb//wBm/8wAZv+ZAGb/ZgBm/zMAZv8AAGbM/wBmzMwAZsyZAGbMZgBmzDMAZswAAGaZ/wBmmcwAZpmZAGaZZgBmmTMAZpkAAGZm/wBmZswAZmaZAGZmZgBmZjMAZmYAAGYz/wBmM8wAZjOZAGYzZgBmMzMAZjMAAGYA/wBmAMwAZgCZAGYAZgBmADMAZgAAADP//wAz/8wAM/+ZADP/ZgAz/zMAM/8AADPM/wAzzMwAM8yZADPMZgAzzDMAM8wAADOZ/wAzmcwAM5mZADOZZgAzmTMAM5kAADNm/wAzZswAM2aZADNmZgAzZjMAM2YAADMz/wAzM8wAMzOZADMzZgAzMzMAMzMAADMA/wAzAMwAMwCZADMAZgAzADMAMwAAAAD//wAA/8wAAP+ZAAD/ZgAA/zMAAP8AAADM/wAAzMwAAMyZAADMZgAAzDMAAMwAAACZ/wAAmcwAAJmZAACZZgAAmTMAAJkAAABm/wAAZswAAGaZAABmZgAAZjMAAGYAAAAz/wAAM8wAADOZAAAzZgAAMzMAADMAAAAA/wAAAMwAAACZAAAAZgAAADMA7gAAAN0AAAC7AAAAqgAAAIgAAAB3AAAAVQAAAEQAAAAiAAAAEQAAAADuAAAA3QAAALsAAACqAAAAiAAAAHcAAABVAAAARAAAACIAAAARAAAAAO4AAADdAAAAuwAAAKoAAACIAAAAdwAAAFUAAABEAAAAIgAAABEA7u7uAN3d3QC7u7sAqqqqAIiIiAB3d3cAVVVVAERERAAiIiIAERERAAAAAA==</Colors>
250+
<Rectangle>
251+
<Left>0</Left>
252+
<Top>0</Top>
253+
<Right>32</Right>
254+
<Bottom>32</Bottom>
255+
</Rectangle>
256+
</Icon>
257+
</VI>
258+
<Project>
259+
<TargetClass>cRIO-9033</TargetClass>
260+
<AutoRunWhenDownloaded>false</AutoRunWhenDownloaded>
261+
<CompilationResultsTree>
262+
<CompilationResults>
263+
<NiFpga>
264+
<BaseAddressOnDevice>0</BaseAddressOnDevice>
265+
<DmaChannelAllocationList>
266+
<Channel name="FXP FIFO">
267+
<BaseAddressTag>NiLvFpgaFXP FIFO</BaseAddressTag>
268+
<ControlSet>0</ControlSet>
269+
<DataType>
270+
<Delta>1.000000000000000000000000000000000000000000000000000000</Delta>
271+
<IntegerWordLength>16</IntegerWordLength>
272+
<Maximum>32767.00000000000000000000000000000000000000000000000000</Maximum>
273+
<Minimum>-32768.00000000000000000000000000000000000000000000000000</Minimum>
274+
<Signed>true</Signed>
275+
<SubType>FXP</SubType>
276+
<WordLength>16</WordLength>
277+
</DataType>
278+
<Direction>TargetToHost</Direction>
279+
<Implementation>niFpgaTargetToHost</Implementation>
280+
<Number>0</Number>
281+
<NumberOfElements>1023</NumberOfElements>
282+
<UserVisible>true</UserVisible>
283+
</Channel>
284+
</DmaChannelAllocationList>
285+
<RegisterBlockList>
286+
<RegisterBlock name="NiLvFpgaFXP FIFO">
287+
<Offset>0xFFC0</Offset>
288+
</RegisterBlock>
289+
</RegisterBlockList>
290+
<UsedBaseClockList>
291+
<BaseClock name="DmaClk">
292+
</BaseClock>
293+
<BaseClock name="BusClk">
294+
</BaseClock>
295+
<BaseClock name="40 MHz Onboard Clock">
296+
</BaseClock>
297+
</UsedBaseClockList>
298+
<version>1</version>
299+
</NiFpga>
300+
</CompilationResults> </CompilationResultsTree>
301+
<MultipleUserClocks>false</MultipleUserClocks>
302+
<AllowImplicitEnableRemoval>false</AllowImplicitEnableRemoval>
303+
</Project>
304+
<ClientData/>
305+
<BitstreamMD5>b28e7b160aafc7cf3ec18faafeb8cde8</BitstreamMD5>
306+
<Bitstream></Bitstream>
307+
</Bitfile>

nifpga/tests/test_bitfile.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import nifpga
55

66
BITFILE_ALL_REGISTERS = 'nifpga/tests/allregisters.lvbitx'
7+
BITFILE_FXP_TYPES = 'nifpga/tests/FXPTypes.lvbitx'
78

89

910
class BitfileTest(unittest.TestCase):
@@ -15,3 +16,15 @@ def test_parse_from_contents(self):
1516
with open(BITFILE_ALL_REGISTERS, 'r') as f:
1617
bitfile = nifpga.Bitfile(f.read(), parse_contents=True)
1718
self.assertTrue(bitfile.filepath is None)
19+
20+
def test_parse_bitfile_with_fxp_fifo(self):
21+
with open(BITFILE_FXP_TYPES, 'r') as f:
22+
bitfile = nifpga.Bitfile(f.read(), parse_contents=True)
23+
with self.assertRaises(KeyError):
24+
bitfile.fifos["FXP FIFO"]
25+
26+
def test_parse_bitfile_with_fxp_register_array(self):
27+
with open(BITFILE_FXP_TYPES, 'r') as f:
28+
bitfile = nifpga.Bitfile(f.read(), parse_contents=True)
29+
with self.assertRaises(KeyError):
30+
bitfile.registers["FXP Array"]

0 commit comments

Comments
 (0)