Parse.cs 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. using FxpConvert.Common;
  2. using System.Reflection;
  3. using System.Xml;
  4. namespace NIFPGA.lvbitx
  5. {
  6. public static class Parse
  7. {
  8. public static Bitfile ParseFile(Stream stream,string name="")
  9. {
  10. XmlDocument document = new XmlDocument();
  11. document.PreserveWhitespace = false;
  12. document.Load(stream);
  13. Bitfile bitfile = new Bitfile();
  14. bitfile.FilePath = name;
  15. var bitfilenode = document.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Bitfile");
  16. if (bitfilenode == null) return bitfile;
  17. bitfile.BitfileVersion = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.BitfileVersion))?.InnerText ?? "";
  18. bitfile.SignatureRegister = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.SignatureRegister))?.InnerText ?? "";
  19. bitfile.SignatureGuids = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.SignatureGuids))?.InnerText ?? "";
  20. bitfile.SignatureNames = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.SignatureNames))?.InnerText ?? "";
  21. bitfile.BitstreamVersion = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.BitstreamVersion))?.InnerText ?? "";
  22. bitfile.BitstreamMD5 = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.BitstreamMD5))?.InnerText ?? "";
  23. var vinode = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.VI));
  24. if (vinode != null)
  25. {
  26. bitfile.VI.Name = vinode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(VI.Name))?.InnerText ?? "";
  27. var reglistnode = vinode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "RegisterList")?.ChildNodes.Cast<XmlNode>().Where(x => x.Name == "Register")?.ToList();
  28. if (reglistnode != null)
  29. {
  30. reglistnode.ForEach(x =>
  31. {
  32. Register register = new Register();
  33. register.Name = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Name))?.InnerText ?? "";
  34. string s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Hidden))?.InnerText ?? "";
  35. if (!string.IsNullOrEmpty(s))
  36. {
  37. register.Hidden = bool.Parse(s);
  38. }
  39. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Indicator))?.InnerText ?? "";
  40. if (!string.IsNullOrEmpty(s))
  41. {
  42. register.Indicator = bool.Parse(s);
  43. }
  44. var datatypenode = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Datatype));
  45. if (datatypenode != null && datatypenode.ChildNodes.Count > 0)
  46. {
  47. var name = datatypenode.ChildNodes[0]?.Name ?? "";
  48. var index = Bitfile.Datatypes.FindIndex(x =>
  49. {
  50. var datatype = x.GetType().GetField(x.ToString())?.GetCustomAttribute<DataTypeAttribute>();
  51. if (datatype == null) return false;
  52. return datatype.Name.Contains(name);
  53. });
  54. if (index >= 0)
  55. {
  56. register.Datatype = Bitfile.Datatypes[index];
  57. if (register.Datatype == Datatype.Array)
  58. {
  59. s = datatypenode.ChildNodes[0]?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Size")?.InnerText ?? "";
  60. if (!string.IsNullOrEmpty(s))
  61. {
  62. register.Size = uint.Parse(s);
  63. }
  64. var typenode = datatypenode.ChildNodes[0]?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Type");
  65. if (typenode != null)
  66. {
  67. name = typenode.ChildNodes[0]?.Name ?? "";
  68. index = Bitfile.Datatypes.FindIndex(x =>
  69. {
  70. var datatype = x.GetType().GetField(x.ToString())?.GetCustomAttribute<DataTypeAttribute>();
  71. if (datatype == null) return false;
  72. return datatype.Name.Contains(name);
  73. });
  74. if (index >= 0)
  75. {
  76. register.ArrayValueType = Bitfile.Datatypes[index];
  77. if (register.ArrayValueType == Datatype.FXP)
  78. {
  79. typenode = typenode.ChildNodes[0];
  80. register.FxpTypeInfo.Name = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(NiFpga_FxpTypeInfo.Name))?.InnerText ?? "";
  81. s = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Signed")?.InnerText ?? "";
  82. if (!string.IsNullOrEmpty(s))
  83. {
  84. register.FxpTypeInfo.isSigned = bool.Parse(s);
  85. }
  86. s = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "WordLength")?.InnerText ?? "";
  87. if (!string.IsNullOrEmpty(s))
  88. {
  89. register.FxpTypeInfo.wordLength = byte.Parse(s);
  90. }
  91. s = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "IntegerWordLength")?.InnerText ?? "";
  92. if (!string.IsNullOrEmpty(s))
  93. {
  94. register.FxpTypeInfo.integerWordLength = short.Parse(s);
  95. }
  96. s = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Minimum")?.InnerText ?? "";
  97. if (!string.IsNullOrEmpty(s))
  98. {
  99. register.FxpTypeInfo.Min = double.Parse(s);
  100. }
  101. s = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Maximum")?.InnerText ?? "";
  102. if (!string.IsNullOrEmpty(s))
  103. {
  104. register.FxpTypeInfo.Max = double.Parse(s);
  105. }
  106. s = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Delta")?.InnerText ?? "";
  107. if (!string.IsNullOrEmpty(s))
  108. {
  109. register.FxpTypeInfo.Delta = double.Parse(s);
  110. }
  111. }
  112. }
  113. }
  114. }
  115. else if (register.Datatype == Datatype.FXP)
  116. {
  117. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault()?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Delta")?.InnerText ?? "";
  118. if (!string.IsNullOrEmpty(s))
  119. {
  120. register.FxpTypeInfo.Delta = double.Parse(s);
  121. }
  122. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault()?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Maximum")?.InnerText ?? "";
  123. if (!string.IsNullOrEmpty(s))
  124. {
  125. register.FxpTypeInfo.Max = double.Parse(s);
  126. }
  127. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault()?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Minimum")?.InnerText ?? "";
  128. if (!string.IsNullOrEmpty(s))
  129. {
  130. register.FxpTypeInfo.Min = double.Parse(s);
  131. }
  132. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault()?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "IntegerWordLength")?.InnerText ?? "";
  133. if (!string.IsNullOrEmpty(s))
  134. {
  135. register.FxpTypeInfo.integerWordLength = short.Parse(s);
  136. }
  137. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault()?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Signed")?.InnerText ?? "";
  138. if (!string.IsNullOrEmpty(s))
  139. {
  140. register.FxpTypeInfo.isSigned = bool.Parse(s);
  141. }
  142. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault()?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "WordLength")?.InnerText ?? "";
  143. if (!string.IsNullOrEmpty(s))
  144. {
  145. register.FxpTypeInfo.wordLength = byte.Parse(s);
  146. }
  147. }
  148. }
  149. }
  150. register.FlattenedType = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.FlattenedType))?.InnerText ?? "";
  151. register.MechanicalAction = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.MechanicalAction))?.InnerText ?? "";
  152. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Offset))?.InnerText ?? "";
  153. if (!string.IsNullOrEmpty(s))
  154. {
  155. register.Offset = uint.Parse(s);
  156. }
  157. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.SizeInBits))?.InnerText ?? "";
  158. if (!string.IsNullOrEmpty(s))
  159. {
  160. register.SizeInBits = uint.Parse(s);
  161. }
  162. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Class))?.InnerText ?? "";
  163. if (!string.IsNullOrEmpty(s))
  164. {
  165. register.Class = uint.Parse(s);
  166. }
  167. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.ID))?.InnerText ?? "";
  168. if (!string.IsNullOrEmpty(s))
  169. {
  170. register.ID = uint.Parse(s);
  171. }
  172. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Internal))?.InnerText ?? "";
  173. if (!string.IsNullOrEmpty(s))
  174. {
  175. register.Internal = bool.Parse(s);
  176. }
  177. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Bidirectional))?.InnerText ?? "";
  178. if (!string.IsNullOrEmpty(s))
  179. {
  180. register.Bidirectional = bool.Parse(s);
  181. }
  182. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Synchronous))?.InnerText ?? "";
  183. if (!string.IsNullOrEmpty(s))
  184. {
  185. register.Synchronous = bool.Parse(s);
  186. }
  187. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.AccessMayTimeout))?.InnerText ?? "";
  188. if (!string.IsNullOrEmpty(s))
  189. {
  190. register.AccessMayTimeout = bool.Parse(s);
  191. }
  192. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.RegisterNode))?.InnerText ?? "";
  193. if (!string.IsNullOrEmpty(s))
  194. {
  195. register.RegisterNode = bool.Parse(s);
  196. }
  197. if (string.IsNullOrEmpty(register.Name)) return;
  198. bitfile.VI.Registers.Add(register);
  199. });
  200. }
  201. }
  202. bitfilenode = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Project");
  203. if (bitfilenode != null)
  204. {
  205. bitfile.Project.TargetClass = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Project.TargetClass))?.InnerText ?? "";
  206. string s = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Project.AutoRunWhenDownloaded))?.InnerText ?? "";
  207. if (!string.IsNullOrEmpty(s))
  208. {
  209. bitfile.Project.AutoRunWhenDownloaded = bool.Parse(s);
  210. }
  211. s = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "CompilationResultsTree")?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "CompilationResults")?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "NiFpga")?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "BaseAddressOnDevice")?.InnerText ?? "0";
  212. if (!string.IsNullOrEmpty(s))
  213. {
  214. bitfile.Project.BaseAddressOnDevice = uint.Parse(s);
  215. }
  216. bitfilenode = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "CompilationResultsTree")?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "CompilationResults")?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "NiFpga")?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "DmaChannelAllocationList");
  217. if (bitfilenode != null)
  218. {
  219. var nodelist = bitfilenode.ChildNodes.Cast<XmlNode>().Where(x => x.Name == "Channel")?.ToList();
  220. if (nodelist != null && nodelist.Count > 0)
  221. {
  222. foreach (XmlNode node in nodelist)
  223. {
  224. DMA dma = new DMA();
  225. dma.Name = node.Attributes?.Cast<XmlAttribute>().FirstOrDefault(x => x.Name == "name")?.InnerText ?? "";
  226. dma.BaseAddressTag = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.BaseAddressTag))?.InnerText ?? "";
  227. s = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.ControlSet))?.InnerText ?? "";
  228. if (!string.IsNullOrEmpty(s))
  229. {
  230. dma.ControlSet = uint.Parse(s);
  231. }
  232. var datatypenode = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "DataType");
  233. if (datatypenode != null)
  234. {
  235. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "SubType")?.InnerText ?? "";
  236. int index = Bitfile.Datatypes.FindIndex(x =>
  237. {
  238. var attribute = x.GetType().GetField(x.ToString())?.GetCustomAttribute<DataTypeAttribute>();
  239. if (attribute == null) return false;
  240. return attribute.Name.Contains(s);
  241. });
  242. if (index >= 0)
  243. {
  244. dma.Datatype = Bitfile.Datatypes[index];
  245. if (dma.Datatype == Datatype.FXP)
  246. {
  247. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Delta")?.InnerText ?? "";
  248. if (!string.IsNullOrEmpty(s))
  249. {
  250. dma.FxpTypeInfo.Delta = double.Parse(s);
  251. }
  252. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Maximum")?.InnerText ?? "";
  253. if (!string.IsNullOrEmpty(s))
  254. {
  255. dma.FxpTypeInfo.Max = double.Parse(s);
  256. }
  257. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Minimum")?.InnerText ?? "";
  258. if (!string.IsNullOrEmpty(s))
  259. {
  260. dma.FxpTypeInfo.Min = double.Parse(s);
  261. }
  262. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "IntegerWordLength")?.InnerText ?? "";
  263. if (!string.IsNullOrEmpty(s))
  264. {
  265. dma.FxpTypeInfo.integerWordLength = short.Parse(s);
  266. }
  267. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Signed")?.InnerText ?? "";
  268. if (!string.IsNullOrEmpty(s))
  269. {
  270. dma.FxpTypeInfo.isSigned = bool.Parse(s);
  271. }
  272. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "WordLength")?.InnerText ?? "";
  273. if (!string.IsNullOrEmpty(s))
  274. {
  275. dma.FxpTypeInfo.wordLength = byte.Parse(s);
  276. }
  277. }
  278. }
  279. }
  280. dma.Direction = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.Direction))?.InnerText ?? "";
  281. dma.Implementation = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.Implementation))?.InnerText ?? "";
  282. s = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.Number))?.InnerText ?? "";
  283. if (!string.IsNullOrEmpty(s))
  284. {
  285. dma.Number = int.Parse(s);
  286. }
  287. s = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.NumberOfElements))?.InnerText ?? "";
  288. if (!string.IsNullOrEmpty(s))
  289. {
  290. dma.NumberOfElements = uint.Parse(s);
  291. }
  292. s = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.UserVisible))?.InnerText ?? "";
  293. if (!string.IsNullOrEmpty(s))
  294. {
  295. dma.UserVisible = bool.Parse(s);
  296. }
  297. bitfile.Project.DMA.Add(dma);
  298. }
  299. }
  300. }
  301. }
  302. return bitfile;
  303. }
  304. public static Bitfile ParseFile(string path)
  305. {
  306. XmlDocument document = new XmlDocument();
  307. document.PreserveWhitespace = false;
  308. document.Load(path);
  309. Bitfile bitfile = new Bitfile();
  310. bitfile.FilePath = path;
  311. var bitfilenode = document.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Bitfile");
  312. if (bitfilenode == null) return bitfile;
  313. bitfile.BitfileVersion = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.BitfileVersion))?.InnerText ?? "";
  314. bitfile.SignatureRegister = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.SignatureRegister))?.InnerText ?? "";
  315. bitfile.SignatureGuids = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.SignatureGuids))?.InnerText ?? "";
  316. bitfile.SignatureNames = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.SignatureNames))?.InnerText ?? "";
  317. bitfile.BitstreamVersion = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.BitstreamVersion))?.InnerText ?? "";
  318. bitfile.BitstreamMD5 = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.BitstreamMD5))?.InnerText ?? "";
  319. var vinode = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Bitfile.VI));
  320. if (vinode != null)
  321. {
  322. bitfile.VI.Name = vinode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(VI.Name))?.InnerText ?? "";
  323. var reglistnode = vinode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "RegisterList")?.ChildNodes.Cast<XmlNode>().Where(x => x.Name == "Register")?.ToList();
  324. if (reglistnode != null)
  325. {
  326. reglistnode.ForEach(x =>
  327. {
  328. Register register = new Register();
  329. register.Name = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Name))?.InnerText ?? "";
  330. string s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Hidden))?.InnerText ?? "";
  331. if (!string.IsNullOrEmpty(s))
  332. {
  333. register.Hidden = bool.Parse(s);
  334. }
  335. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Indicator))?.InnerText ?? "";
  336. if (!string.IsNullOrEmpty(s))
  337. {
  338. register.Indicator = bool.Parse(s);
  339. }
  340. var datatypenode = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Datatype));
  341. if (datatypenode != null && datatypenode.ChildNodes.Count > 0)
  342. {
  343. var name = datatypenode.ChildNodes[0]?.Name ?? "";
  344. var index = Bitfile.Datatypes.FindIndex(x =>
  345. {
  346. var datatype = x.GetType().GetField(x.ToString())?.GetCustomAttribute<DataTypeAttribute>();
  347. if (datatype == null) return false;
  348. return datatype.Name.Contains(name);
  349. });
  350. if (index >= 0)
  351. {
  352. register.Datatype = Bitfile.Datatypes[index];
  353. if (register.Datatype == Datatype.Array)
  354. {
  355. s = datatypenode.ChildNodes[0]?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Size")?.InnerText ?? "";
  356. if (!string.IsNullOrEmpty(s))
  357. {
  358. register.Size = uint.Parse(s);
  359. }
  360. var typenode = datatypenode.ChildNodes[0]?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Type");
  361. if (typenode != null)
  362. {
  363. name = typenode.ChildNodes[0]?.Name ?? "";
  364. index = Bitfile.Datatypes.FindIndex(x =>
  365. {
  366. var datatype = x.GetType().GetField(x.ToString())?.GetCustomAttribute<DataTypeAttribute>();
  367. if (datatype == null) return false;
  368. return datatype.Name.Contains(name);
  369. });
  370. if (index >= 0)
  371. {
  372. register.ArrayValueType = Bitfile.Datatypes[index];
  373. if (register.ArrayValueType == Datatype.FXP)
  374. {
  375. typenode = typenode.ChildNodes[0];
  376. register.FxpTypeInfo.Name = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(NiFpga_FxpTypeInfo.Name))?.InnerText ?? "";
  377. s = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Signed")?.InnerText ?? "";
  378. if (!string.IsNullOrEmpty(s))
  379. {
  380. register.FxpTypeInfo.isSigned = bool.Parse(s);
  381. }
  382. s = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "WordLength")?.InnerText ?? "";
  383. if (!string.IsNullOrEmpty(s))
  384. {
  385. register.FxpTypeInfo.wordLength = byte.Parse(s);
  386. }
  387. s = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "IntegerWordLength")?.InnerText ?? "";
  388. if (!string.IsNullOrEmpty(s))
  389. {
  390. register.FxpTypeInfo.integerWordLength = short.Parse(s);
  391. }
  392. s = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Minimum")?.InnerText ?? "";
  393. if (!string.IsNullOrEmpty(s))
  394. {
  395. register.FxpTypeInfo.Min = double.Parse(s);
  396. }
  397. s = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Maximum")?.InnerText ?? "";
  398. if (!string.IsNullOrEmpty(s))
  399. {
  400. register.FxpTypeInfo.Max = double.Parse(s);
  401. }
  402. s = typenode?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Delta")?.InnerText ?? "";
  403. if (!string.IsNullOrEmpty(s))
  404. {
  405. register.FxpTypeInfo.Delta = double.Parse(s);
  406. }
  407. }
  408. }
  409. }
  410. }
  411. else if (register.Datatype == Datatype.FXP)
  412. {
  413. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault()?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Delta")?.InnerText ?? "";
  414. if (!string.IsNullOrEmpty(s))
  415. {
  416. register.FxpTypeInfo.Delta = double.Parse(s);
  417. }
  418. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault()?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Maximum")?.InnerText ?? "";
  419. if (!string.IsNullOrEmpty(s))
  420. {
  421. register.FxpTypeInfo.Max = double.Parse(s);
  422. }
  423. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault()?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Minimum")?.InnerText ?? "";
  424. if (!string.IsNullOrEmpty(s))
  425. {
  426. register.FxpTypeInfo.Min = double.Parse(s);
  427. }
  428. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault()?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "IntegerWordLength")?.InnerText ?? "";
  429. if (!string.IsNullOrEmpty(s))
  430. {
  431. register.FxpTypeInfo.integerWordLength = short.Parse(s);
  432. }
  433. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault()?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Signed")?.InnerText ?? "";
  434. if (!string.IsNullOrEmpty(s))
  435. {
  436. register.FxpTypeInfo.isSigned = bool.Parse(s);
  437. }
  438. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault()?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "WordLength")?.InnerText ?? "";
  439. if (!string.IsNullOrEmpty(s))
  440. {
  441. register.FxpTypeInfo.wordLength = byte.Parse(s);
  442. }
  443. }
  444. }
  445. }
  446. register.FlattenedType = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.FlattenedType))?.InnerText ?? "";
  447. register.MechanicalAction = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.MechanicalAction))?.InnerText ?? "";
  448. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Offset))?.InnerText ?? "";
  449. if (!string.IsNullOrEmpty(s))
  450. {
  451. register.Offset = uint.Parse(s);
  452. }
  453. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.SizeInBits))?.InnerText ?? "";
  454. if (!string.IsNullOrEmpty(s))
  455. {
  456. register.SizeInBits = uint.Parse(s);
  457. }
  458. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Class))?.InnerText ?? "";
  459. if (!string.IsNullOrEmpty(s))
  460. {
  461. register.Class = uint.Parse(s);
  462. }
  463. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.ID))?.InnerText ?? "";
  464. if (!string.IsNullOrEmpty(s))
  465. {
  466. register.ID = uint.Parse(s);
  467. }
  468. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Internal))?.InnerText ?? "";
  469. if (!string.IsNullOrEmpty(s))
  470. {
  471. register.Internal = bool.Parse(s);
  472. }
  473. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Bidirectional))?.InnerText ?? "";
  474. if (!string.IsNullOrEmpty(s))
  475. {
  476. register.Bidirectional = bool.Parse(s);
  477. }
  478. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.Synchronous))?.InnerText ?? "";
  479. if (!string.IsNullOrEmpty(s))
  480. {
  481. register.Synchronous = bool.Parse(s);
  482. }
  483. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.AccessMayTimeout))?.InnerText ?? "";
  484. if (!string.IsNullOrEmpty(s))
  485. {
  486. register.AccessMayTimeout = bool.Parse(s);
  487. }
  488. s = x.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Register.RegisterNode))?.InnerText ?? "";
  489. if (!string.IsNullOrEmpty(s))
  490. {
  491. register.RegisterNode = bool.Parse(s);
  492. }
  493. if (string.IsNullOrEmpty(register.Name)) return;
  494. bitfile.VI.Registers.Add(register);
  495. });
  496. }
  497. }
  498. bitfilenode = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Project");
  499. if (bitfilenode != null)
  500. {
  501. bitfile.Project.TargetClass = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Project.TargetClass))?.InnerText ?? "";
  502. string s = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Project.AutoRunWhenDownloaded))?.InnerText ?? "";
  503. if (!string.IsNullOrEmpty(s))
  504. {
  505. bitfile.Project.AutoRunWhenDownloaded = bool.Parse(s);
  506. }
  507. s = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "CompilationResultsTree")?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "CompilationResults")?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "NiFpga")?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "BaseAddressOnDevice")?.InnerText ?? "0";
  508. if (!string.IsNullOrEmpty(s))
  509. {
  510. bitfile.Project.BaseAddressOnDevice = uint.Parse(s);
  511. }
  512. bitfilenode = bitfilenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "CompilationResultsTree")?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "CompilationResults")?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "NiFpga")?.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "DmaChannelAllocationList");
  513. if (bitfilenode != null)
  514. {
  515. var nodelist = bitfilenode.ChildNodes.Cast<XmlNode>().Where(x => x.Name == "Channel")?.ToList();
  516. if (nodelist != null && nodelist.Count > 0)
  517. {
  518. foreach (XmlNode node in nodelist)
  519. {
  520. DMA dma = new DMA();
  521. dma.Name = node.Attributes?.Cast<XmlAttribute>().FirstOrDefault(x => x.Name == "name")?.InnerText ?? "";
  522. dma.BaseAddressTag = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.BaseAddressTag))?.InnerText ?? "";
  523. s = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.ControlSet))?.InnerText ?? "";
  524. if (!string.IsNullOrEmpty(s))
  525. {
  526. dma.ControlSet = uint.Parse(s);
  527. }
  528. var datatypenode = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "DataType");
  529. if (datatypenode != null)
  530. {
  531. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "SubType")?.InnerText ?? "";
  532. int index = Bitfile.Datatypes.FindIndex(x =>
  533. {
  534. var attribute = x.GetType().GetField(x.ToString())?.GetCustomAttribute<DataTypeAttribute>();
  535. if (attribute == null) return false;
  536. return attribute.Name.Contains(s);
  537. });
  538. if (index >= 0)
  539. {
  540. dma.Datatype = Bitfile.Datatypes[index];
  541. if (dma.Datatype == Datatype.FXP)
  542. {
  543. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Delta")?.InnerText ?? "";
  544. if (!string.IsNullOrEmpty(s))
  545. {
  546. dma.FxpTypeInfo.Delta = double.Parse(s);
  547. }
  548. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Maximum")?.InnerText ?? "";
  549. if (!string.IsNullOrEmpty(s))
  550. {
  551. dma.FxpTypeInfo.Max = double.Parse(s);
  552. }
  553. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Minimum")?.InnerText ?? "";
  554. if (!string.IsNullOrEmpty(s))
  555. {
  556. dma.FxpTypeInfo.Min = double.Parse(s);
  557. }
  558. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "IntegerWordLength")?.InnerText ?? "";
  559. if (!string.IsNullOrEmpty(s))
  560. {
  561. dma.FxpTypeInfo.integerWordLength = short.Parse(s);
  562. }
  563. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "Signed")?.InnerText ?? "";
  564. if (!string.IsNullOrEmpty(s))
  565. {
  566. dma.FxpTypeInfo.isSigned = bool.Parse(s);
  567. }
  568. s = datatypenode.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "WordLength")?.InnerText ?? "";
  569. if (!string.IsNullOrEmpty(s))
  570. {
  571. dma.FxpTypeInfo.wordLength = byte.Parse(s);
  572. }
  573. }
  574. }
  575. }
  576. dma.Direction = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.Direction))?.InnerText ?? "";
  577. dma.Implementation = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.Implementation))?.InnerText ?? "";
  578. s = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.Number))?.InnerText ?? "";
  579. if (!string.IsNullOrEmpty(s))
  580. {
  581. dma.Number = int.Parse(s);
  582. }
  583. s = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.NumberOfElements))?.InnerText ?? "";
  584. if (!string.IsNullOrEmpty(s))
  585. {
  586. dma.NumberOfElements = uint.Parse(s);
  587. }
  588. s = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(DMA.UserVisible))?.InnerText ?? "";
  589. if (!string.IsNullOrEmpty(s))
  590. {
  591. dma.UserVisible = bool.Parse(s);
  592. }
  593. bitfile.Project.DMA.Add(dma);
  594. }
  595. }
  596. }
  597. }
  598. return bitfile;
  599. }
  600. }
  601. }