FoxTRMTools.Mod 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. MODULE FoxTRMTools;
  2. IMPORT Files,Commands,Options,Strings,Basic := FoxBasic, Diagnostics, BitSets,ObjectFile,Streams;
  3. (*! check spartan 6 code emission *)
  4. PROCEDURE PatchSpartan6(CONST this: ARRAY OF CHAR; VAR result: ARRAY OF CHAR; line: LONGINT);
  5. (*
  6. decode 36 bits 2 instruction big endian format
  7. 35 ... 18 17 .. 0
  8. ins2_bit17 ... ins2_bit0 ins1_bit17 .. ins1_bit0
  9. to 2 x 18 bits instructions in the following form
  10. 35 34 33..16 15..0
  11. ins2_bit17, ins2_bit16 ins1_bit17 ... inst1_bit0 ins2_bit15.. ins2_bit_0
  12. *)
  13. VAR inpos, outpos, i, bits, i1, i2, val: LONGINT;
  14. PROCEDURE ReadInt(): LONGINT;
  15. VAR c: CHAR;
  16. BEGIN
  17. c := this[inpos]; INC(inpos);
  18. CASE c OF
  19. '0' .. '9': RETURN ORD(c)- ORD('0')
  20. |'A'..'F': RETURN ORD(c) - ORD('A') + 10
  21. |'a'..'f': RETURN ORD(c) - ORD('a') + 10
  22. ELSE HALT(100) (* to be on the safe side *)
  23. END;
  24. END ReadInt;
  25. PROCEDURE WriteInt(i: LONGINT);
  26. VAR c: CHAR;
  27. BEGIN
  28. IF i < 0AH THEN c := CHR(i + ORD('0'))
  29. ELSIF i < 10H THEN c := CHR(i-10 + ORD('A'))
  30. ELSE HALT(100)
  31. END;
  32. result[outpos] := c; INC(outpos);
  33. END WriteInt;
  34. BEGIN
  35. (* decode *)
  36. inpos := 0; outpos := 0;
  37. WHILE (this[inpos] # 0X) & (this[inpos] <=" ") DO INC(inpos) END; (* skip spaces, if any *)
  38. i1 := 0; i2 := 0;
  39. IF this[inpos] # 0X THEN
  40. i2 := 0;
  41. (* upper most 16 bits of i2 *)
  42. FOR i := 0 TO 3 DO
  43. i2 := i2 * 10H + ReadInt();
  44. END;
  45. (* lower most 2 bits of i2 *)
  46. val := ReadInt();
  47. i2 := i2 * 4 + val DIV 4;
  48. (* upper most 2 bits of i1 *)
  49. i1 := val MOD 4;
  50. (* lower most 16 bits of i2 *)
  51. FOR i := 0 TO 3 DO
  52. i1 := i1 * 10H + ReadInt();
  53. END;
  54. (* make sure that no meaningful code is written to the "forbidden" islands *)
  55. ASSERT((line MOD 512 < 480) OR (line MOD 512 > 487) OR (i1 = 0) & (i2=0) OR (this = "fffffffff"));
  56. i := 0;
  57. (* upper most 2 bits of i1 and i2 *)
  58. WriteInt( (i2 DIV 10000H) * 4 + (i1 DIV 10000H) );
  59. i2 := i2 MOD 10000H; i1 := i1 MOD 10000H;
  60. (* remaining 16 bits of i1 *)
  61. bits := 10000H;
  62. FOR i := 0 TO 3 DO
  63. i1 := i1 MOD bits; bits := bits DIV 10H;
  64. WriteInt(i1 DIV bits);
  65. END;
  66. (* remaining 16 bits of i2 *)
  67. bits := 10000H;
  68. FOR i := 0 TO 3 DO
  69. i2 := i2 MOD bits; bits := bits DIV 10H;
  70. WriteInt(i2 DIV bits);
  71. END;
  72. END;
  73. result[outpos] := 0X;
  74. END PatchSpartan6;
  75. (*trm code file is split into columns. baseDiv words per line, line distributed onto numBase words.
  76. target --> target_base_<i>, horizontally running index <i>
  77. *)
  78. PROCEDURE SplitColumns* (CONST source,target: ARRAY OF CHAR; instructionWidth, numBase, baseDiv: LONGINT;diagnostics: Diagnostics.Diagnostics): BOOLEAN;
  79. VAR
  80. i,j,k,numReadNibbles,nibble,payloadInLeadingNibble,unCutWordLength:LONGINT;
  81. files: ARRAY 5 OF Files.File;
  82. writers: ARRAY 5 OF Files.Writer;
  83. currFileName: Files.FileName;
  84. base: BitSets.BitSet;
  85. word: BitSets.BitSet;
  86. reader: Files.Reader;
  87. inputFileName: Files.FileName;
  88. inputFile: Files.File;
  89. line: ARRAY 128 OF CHAR;
  90. BEGIN
  91. (*generate multiple outupt files. horizontal split into blocks later using splitfiles*)
  92. FOR i:=0 TO numBase-1 DO(*create filenames*)
  93. (*copy name. add '.base i' to distinguish*)
  94. COPY(target,currFileName);
  95. (*Strings.Append(currFileName,"_base_");*)
  96. Basic.AppendNumber(currFileName, i);
  97. files[i]:= Files.New(currFileName);
  98. Files.OpenWriter(writers[i],files[i],0);
  99. END;
  100. unCutWordLength:= (numBase*36) DIV (baseDiv); (*a division of the base row may be longer than the actual word length*)
  101. payloadInLeadingNibble:=instructionWidth MOD 4;
  102. IF payloadInLeadingNibble=0 THEN payloadInLeadingNibble:=payloadInLeadingNibble+4; END;
  103. numReadNibbles:=instructionWidth DIV 4;
  104. IF payloadInLeadingNibble<4 THEN
  105. INC(numReadNibbles);
  106. END;
  107. COPY(source, inputFileName);
  108. inputFile := Files.Old(inputFileName);
  109. IF inputFile= NIL THEN
  110. diagnostics.Error(inputFileName,Streams.Invalid,"could not open file");
  111. RETURN FALSE
  112. END;
  113. Files.OpenReader( reader,inputFile,0);
  114. NEW(base,numBase*36);
  115. NEW(word,instructionWidth);
  116. WHILE reader.Available()>0 DO (*assumes number of words is a multiple of baseDiv. make sure in static linker*)
  117. base.Zero;
  118. (*read a BASE line*)
  119. FOR k:=0 TO baseDiv-1 DO
  120. (*read a word into the base*)
  121. word.Zero;
  122. j:=0;
  123. (*read 1 word from row into BASE bitset*)
  124. reader.LnEOT(line);
  125. (*TRACE(line);
  126. TRACE(payloadInLeadingNibble);
  127. TRACE(line[0]);*)
  128. (*read first nibble, removes padding*)
  129. nibble:=ObjectFile.CharacterToNibble(line[0]);
  130. j:=j+payloadInLeadingNibble;
  131. word.SetBits(instructionWidth-j,payloadInLeadingNibble, nibble);
  132. (*read rest*)
  133. FOR i:=1 TO numReadNibbles-1 DO
  134. (*TRACE(line[i]);*)
  135. nibble:=ObjectFile.CharacterToNibble(line[i]);
  136. j:=j+4;
  137. word.SetBits(instructionWidth-j,4,nibble);
  138. END;
  139. (*note there may be gaps because unCut is larger than insW*)
  140. BitSets.CopyBits(word,0,base,k*unCutWordLength,instructionWidth);
  141. END;
  142. FOR j:= 0 TO numBase-1 DO (*divide base into the columns*)
  143. (*write 36 bits to appropriate file*) (*writing msb first*)
  144. FOR k:=8 TO 0 BY -1 DO
  145. writers[j].Char(ObjectFile.NibbleToCharacter(base.GetBits((j)*36+k*4,4) ) );
  146. END;
  147. writers[j].Ln;
  148. END;
  149. END;
  150. FOR i:=0 TO numBase-1 DO
  151. writers[i].Update;
  152. Files.Register(files[i]);
  153. END;
  154. RETURN TRUE
  155. END SplitColumns;
  156. PROCEDURE DoSplitFiles*(CONST source, dest, extension: ARRAY OF CHAR; blocks, blockSize: LONGINT; verbose,strided,patchSpartan6: BOOLEAN; diagnostics: Diagnostics.Diagnostics): BOOLEAN;
  157. VAR line: LONGINT; fileName: Files.FileName; oldFile: Files.File;
  158. newFiles: POINTER TO ARRAY OF Files.File;
  159. reader: Files.Reader;
  160. writers: POINTER TO ARRAY OF Files.Writer;
  161. x: ARRAY 128 OF CHAR;
  162. i,fileNumber: LONGINT;
  163. linewidth: LONGINT;
  164. PROCEDURE GetFileName(index: LONGINT; VAR fileName: ARRAY OF CHAR);
  165. BEGIN
  166. COPY(dest,fileName);
  167. Basic.AppendNumber(fileName, index);
  168. Files.JoinExtension(fileName,extension,fileName);
  169. END GetFileName;
  170. BEGIN
  171. TRACE(source);
  172. COPY(source, fileName);
  173. oldFile := Files.Old(fileName);
  174. IF oldFile = NIL THEN
  175. diagnostics.Error(fileName,Streams.Invalid,"could not open file");
  176. RETURN FALSE
  177. END;
  178. Files.OpenReader( reader,oldFile,0);
  179. NEW(newFiles, blocks);
  180. NEW(writers, blocks);
  181. FOR i := 0 TO blocks-1 DO
  182. GetFileName(i,fileName);
  183. newFiles[i] := Files.New(fileName);
  184. IF newFiles[i]= NIL THEN
  185. diagnostics.Error(fileName,Streams.Invalid,"could not open file");
  186. RETURN FALSE
  187. ELSE
  188. Files.OpenWriter(writers[i],newFiles[i],0);
  189. END;
  190. IF verbose THEN
  191. diagnostics.Information(fileName,Streams.Invalid,"file generated");
  192. END;
  193. END;
  194. (*If strided: read line by line, fill round robin into the output files*)
  195. line := 0;
  196. WHILE (line < blocks*blockSize) & (reader.Available()>0) DO
  197. IF strided THEN fileNumber := line MOD blocks ELSE fileNumber := line DIV blockSize END;
  198. reader.LnEOT(x);
  199. IF linewidth = 0 THEN linewidth := Strings.Length(x) END;
  200. IF patchSpartan6 THEN PatchSpartan6(x,x, line) END;
  201. writers[fileNumber].String(x); writers[fileNumber].Ln;
  202. INC(line);
  203. END;
  204. ASSERT((linewidth = 8) OR (linewidth =9) OR (linewidth = 0));
  205. WHILE line < blocks*blockSize DO
  206. IF strided THEN fileNumber := line MOD blocks ELSE fileNumber := line DIV blockSize END;
  207. FOR i := 0 TO linewidth-1 DO
  208. writers[fileNumber].Char("0");
  209. END;
  210. writers[fileNumber].Ln;
  211. INC(line);
  212. END;
  213. IF reader.Available()>0 THEN
  214. diagnostics.Warning(source,Streams.Invalid,"source file truncated");
  215. END;
  216. FOR i := 0 TO blocks-1 DO
  217. writers[i].Update; Files.Register(newFiles[i])
  218. END;
  219. RETURN TRUE
  220. END DoSplitFiles;
  221. PROCEDURE SplitFiles* (context: Commands.Context);
  222. VAR options: Options.Options;
  223. sourceName, name, extension: Files.FileName;
  224. blocks: LONGINT;
  225. blockSize: LONGINT;
  226. strided: BOOLEAN;
  227. diagnostics: Diagnostics.StreamDiagnostics;
  228. done: BOOLEAN;
  229. BEGIN
  230. NEW (options);
  231. options.Add('b',"blocks",Options.Integer);
  232. options.Add('s',"blockSize",Options.Integer);
  233. options.Add('S',"strided",Options.Flag);
  234. options.Add(0X,"patchSpartan6", Options.Flag);
  235. IF ~options.Parse (context.arg, context.error) THEN context.result := Commands.CommandParseError; RETURN; END;
  236. IF ~options.GetInteger("blocks",blocks) THEN blocks := 1 END;
  237. IF ~options.GetInteger("blockSize",blockSize) THEN blockSize := 1024 END;
  238. strided := options.GetFlag("strided");
  239. NEW(diagnostics,context.out);
  240. done := TRUE;
  241. WHILE done & context.arg.GetString (name) DO
  242. Files.SplitExtension(name,sourceName,extension);
  243. done := DoSplitFiles(name, sourceName, extension, blocks, blockSize, TRUE, strided, options.GetFlag("patchSpartan6"), diagnostics);
  244. END;
  245. END SplitFiles;
  246. (*numBase words of 36 bits each are assembled to a base, and each base holds baseDiv words of 18 bits each.*)
  247. PROCEDURE SplitColumnsCmd* (context: Commands.Context); (*todo: rename as splitColumns, fix all call sites*)
  248. VAR options: Options.Options;
  249. name: Files.FileName;
  250. insW,numB,baseD: LONGINT;
  251. diagnostics: Diagnostics.StreamDiagnostics;
  252. done: BOOLEAN;
  253. targetName: ARRAY 128 OF CHAR;
  254. BEGIN
  255. NEW (options);
  256. options.Add('i',"instructionWidth",Options.Integer);
  257. options.Add('n',"numBases",Options.Integer);
  258. options.Add('b',"baseDivider",Options.Integer);
  259. options.Add('t',"target",Options.String);
  260. IF ~options.Parse (context.arg, context.error) THEN context.result := Commands.CommandParseError; RETURN; END;
  261. IF ~options.GetInteger("instructionWidth",insW) THEN insW:= 18 END;
  262. IF ~options.GetInteger("numBases",numB) THEN numB:=1 END;
  263. IF ~options.GetInteger("baseDivider",baseD) THEN baseD:=2 END;
  264. IF ~options.GetString("target",targetName) THEN targetName:="default.mem" END;
  265. NEW(diagnostics,context.out);
  266. diagnostics.Information("target name", Streams.Invalid, targetName);
  267. done:=TRUE;
  268. WHILE done & context.arg.GetString (name) DO
  269. diagnostics.Information("source name", Streams.Invalid, name);
  270. done := SplitColumns(name, targetName, insW, numB, baseD, diagnostics);
  271. END;
  272. END SplitColumnsCmd;
  273. PROCEDURE CompareFiles*(context: Commands.Context);
  274. VAR f1,f2,f3: Files.File; name1, name2, matrixname: Files.FileName; r1, r2: Files.Reader; x,y: ARRAY 32 OF CHAR; i: LONGINT; line1: LONGINT;
  275. matrix: ARRAY 16 OF ARRAY 16 OF LONGINT; j: LONGINT; p1, p2: LONGINT; writer: Files.Writer;
  276. PROCEDURE Value(c: CHAR): LONGINT;
  277. BEGIN
  278. CASE c OF
  279. '0' .. '9': RETURN ORD(c)- ORD('0')
  280. |'A'..'F': RETURN ORD(c) - ORD('A') + 10
  281. |'a'..'f': RETURN ORD(c) - ORD('a') + 10
  282. ELSE HALT(100) (* to be on the safe side *)
  283. END;
  284. END Value;
  285. BEGIN
  286. IF context.arg.GetString(name1) & context.arg.GetString(name2) & context.arg.GetString(matrixname) THEN
  287. f1 := Files.Old(name1); f2 := Files.Old(name2); f3 := Files.New(matrixname);
  288. NEW(r1,f1,0); NEW(r2,f2,0); NEW(writer, f3,0);
  289. WHILE (r1.Available() > 0) & (r2.Available() > 0) DO
  290. r1.LnEOT(x);r2.LnEOT(y);
  291. IF (line1 MOD 512 >= 480) & (line1 MOD 512 <= 487) THEN
  292. p1 := (Value(x[0]) DIV 4H)*4H+Value(x[4]) MOD 4H;
  293. p2 := (Value(y[0]) DIV 4H)*4H+Value(y[4]) MOD 4H;
  294. context.out.Int(line1,1); context.out.Ln; context.out.Update;
  295. ASSERT(Value(x[0]) MOD 4 = Value(y[0]) MOD 4);
  296. ASSERT(Value(x[4]) DIV 4 = Value(y[4]) DIV 4);
  297. INC(matrix[p1, p2]);
  298. ELSE
  299. ASSERT(x = y);
  300. END;
  301. INC(line1);
  302. (*
  303. IF (line1 MOD 512 = 480) THEN
  304. context.out.Int(line1,1); context.out.String(":");
  305. WHILE line1 MOD 512 < 487 DO
  306. r1.LnEOT(x);
  307. i := 0;
  308. WHILE (x[i] # 0X) DO
  309. IF i IN {0,4} THEN
  310. WriteBits(x[i]);
  311. ELSE
  312. context.out.Char(x[i]);
  313. END;
  314. context.out.String("|");
  315. INC(i);
  316. END;
  317. context.out.String(" ");
  318. INC(line1);
  319. END;
  320. WriteLn;
  321. context.out.Int(line2,1); context.out.String(":");
  322. WHILE line2 MOD 512 < 487 DO
  323. r2.LnEOT(y);
  324. i := 0;
  325. WHILE (y[i] # 0X) DO
  326. IF i IN {0,4} THEN
  327. WriteBits(y[i]);
  328. ELSE context.out.Char(y[i]);
  329. END;
  330. context.out.String("|");
  331. INC(i)
  332. END;
  333. context.out.String(" ");
  334. INC(line2);
  335. END;
  336. WriteLn;
  337. WriteLn;
  338. ELSE INC(line1); INC(line2);r1.LnEOT(x);r2.LnEOT(y);
  339. END;
  340. *)
  341. END;
  342. FOR i := 0 TO 15 DO
  343. FOR j := 0 TO 15 DO
  344. writer.Int(matrix[i,j],1); writer.String(" ");
  345. context.out.Int(matrix[i,j],1); context.out.String(" ");
  346. END;
  347. context.out.Ln;
  348. writer.Ln;
  349. END;
  350. writer.Update;
  351. Files.Register(f3);
  352. END;
  353. END CompareFiles;
  354. (*
  355. PROCEDURE SameFiles(CONST filename1, filename2: ARRAY OF CHAR): BOOLEAN;
  356. VAR
  357. file1, file2 : Files.File; reader1, reader2 : Files.Reader; ch1, ch2 : CHAR;
  358. BEGIN
  359. file1 := Files.Old(filename1);
  360. IF (file1# NIL) THEN
  361. file2 := Files.Old(filename2);
  362. IF (file2 # NIL) THEN
  363. IF (file1.Length() = file2.Length()) THEN
  364. NEW(reader1, file1, 0);
  365. NEW(reader2, file2, 0);
  366. REPEAT
  367. reader1.Char(ch1);
  368. reader2.Char(ch2);
  369. UNTIL (ch1 # ch2) OR (reader1.res # Files.Ok) OR (reader2.res # Files.Ok);
  370. IF (ch1 = ch2) & (reader1.res = reader2.res) & (reader1.res = Streams.EOF) THEN
  371. RETURN TRUE;
  372. ELSE
  373. RETURN FALSE;
  374. END;
  375. ELSE
  376. RETURN FALSE;
  377. END;
  378. ELSE
  379. RETURN FALSE;
  380. END;
  381. ELSE
  382. RETURN FALSE;
  383. END;
  384. END SameFiles;
  385. *)
  386. (*
  387. PROCEDURE DeleteFiles(CONST fileSelectionMask: ARRAY OF CHAR; context: Commands.Context; VAR res: WORD);
  388. VAR
  389. enum: Files.Enumerator;
  390. flags: SET;
  391. time, date, size: LONGINT;
  392. name: Files.FileName;
  393. BEGIN
  394. NEW(enum);
  395. enum.Open(fileSelectionMask,{});
  396. res := 0;
  397. WHILE (res = 0) & enum.GetEntry(name,flags,time,date,size) DO
  398. IF ~(Files.Directory IN flags) THEN
  399. context.out.String("deleting file "); context.out.String(name); context.out.String(" ...");
  400. Files.Delete(name,res);
  401. IF res = 0 THEN context.out.String(" Ok"); context.out.Ln; context.out.Update;
  402. ELSE
  403. context.error.String("failed to delete file "); context.error.String(name); context.error.String(", res="); context.error.Int(res,0); context.error.Ln; context.error.Update;
  404. END;
  405. END;
  406. END;
  407. END DeleteFiles;
  408. *)
  409. END FoxTRMTools.
  410. FoxTRMTools.Test ~
  411. Compiler.Compile -b=TRM --objectFile=Intermediate --activeCells --noRuntimeChecks --activeCellsSpecification=FoxAVSP6LX75T --patchSpartan6
  412. oc/TRM.RS232.Mod
  413. oc/TRM.Testing.Mod
  414. oc/TRM.Runtime.Mod
  415. oc/TRM.TestNet.Mdf
  416. ~
  417. Compiler.Compile -b=TRM --objectFile=Intermediate --activeCells --noRuntimeChecks --activeCellsSpecification=ML505
  418. oc/TRM.RS232.Mod
  419. oc/TRM.Testing.Mod
  420. oc/TRM.Runtime.Mod
  421. oc/TRM.TestNet.Mdf
  422. ~
  423. FoxAVSP6LX75T.ReadSpecification TestNet ~
  424. FoxTRMTools.BuildHardware -p="AVSP6LX75T" -f="TestNet" ~
  425. FoxTRMTools.BuildHardware -p="ML505" -f="TestNet" ~
  426. System.Free FoxTRMTools ~
  427. FoxTRMTools.SplitFiles code.mem data.mem ~
  428. FoxTRMTools.SplitFiles --blocks=8 --strided data.mem ~
  429. PET.Open data.mem ~
  430. PET.Open data0.mem ~
  431. PET.Open data1.mem ~
  432. FoxTRMTools.GenerateTestFile test.code ~
  433. FoxTRMTools.GenerateTestFile --value=010H test.code ~
  434. FoxTRMTools.GenerateTestFile --random test.code ~
  435. FoxTRMTools.GenerateTestFile --sourceFile=binary.code test2.code ~
  436. FoxTRMTools.SplitFiles --blockSize=1024 --blocks=5 test.code ~
  437. PET.Open -e test.code test2.code ~
  438. FoxTRMTools.CompareFiles test.code test2.code matrix.txt ~
  439. UARTPC.Open 6 ~
  440. System.DoCommands
  441. FoxTRMTools.GenerateTestFile --random --size=4096 TestBRAM0con0code.mem ~
  442. FoxTRMTools.SplitFiles --blockSize=512 --blocks=8 --patchSpartan6 TestBRAM0con0code.mem ~
  443. WinApplications.Run "testbram.bat" ~
  444. UARTPC.DumpBRAM 6 0 8192 "bram.dat" ~
  445. FoxTRMTools.GenerateTestFile --sourceFile=bram.dat test.code ~
  446. PET.Open -e TestBRAM0con0code.mem test.code ~
  447. FoxTRMTools.CompareFiles TestBRAM0con0code.mem test.code bram.mtx~
  448. FoxTRMTools.GenerateTestFile --random --size=4096 TestBRAM0con0code.mem ~
  449. FoxTRMTools.SplitFiles --blockSize=512 --blocks=8 --patchSpartan6 TestBRAM0con0code.mem ~
  450. WinApplications.Run "testbram.bat" ~
  451. UARTPC.DumpBRAM 6 0 8192 "bram.dat" ~
  452. FoxTRMTools.GenerateTestFile --sourceFile=bram.dat test.code ~
  453. PET.Open -e TestBRAM0con0code.mem test.code ~
  454. FoxTRMTools.CompareFiles TestBRAM0con0code.mem test.code bram.mtx~
  455. FoxTRMTools.GenerateTestFile --random --size=4096 TestBRAM0con0code.mem ~
  456. FoxTRMTools.SplitFiles --blockSize=512 --blocks=8 --patchSpartan6 TestBRAM0con0code.mem ~
  457. WinApplications.Run "testbram.bat" ~
  458. UARTPC.DumpBRAM 6 0 8192 "bram.dat" ~
  459. FoxTRMTools.GenerateTestFile --sourceFile=bram.dat test.code ~
  460. PET.Open -e TestBRAM0con0code.mem test.code ~
  461. FoxTRMTools.CompareFiles TestBRAM0con0code.mem test.code bram.mtx~
  462. FoxTRMTools.GenerateTestFile --random --size=4096 TestBRAM0con0code.mem ~
  463. FoxTRMTools.SplitFiles --blockSize=512 --blocks=8 --patchSpartan6 TestBRAM0con0code.mem ~
  464. WinApplications.Run "testbram.bat" ~
  465. UARTPC.DumpBRAM 6 0 8192 "bram.dat" ~
  466. FoxTRMTools.GenerateTestFile --sourceFile=bram.dat test.code ~
  467. PET.Open -e TestBRAM0con0code.mem test.code ~
  468. FoxTRMTools.CompareFiles TestBRAM0con0code.mem test.code bram.mtx~
  469. FoxTRMTools.GenerateTestFile --random --size=4096 TestBRAM0con0code.mem ~
  470. FoxTRMTools.SplitFiles --blockSize=512 --blocks=8 --patchSpartan6 TestBRAM0con0code.mem ~
  471. WinApplications.Run "testbram.bat" ~
  472. UARTPC.DumpBRAM 6 0 8192 "bram.dat" ~
  473. FoxTRMTools.GenerateTestFile --sourceFile=bram.dat test.code ~
  474. PET.Open -e TestBRAM0con0code.mem test.code ~
  475. FoxTRMTools.CompareFiles TestBRAM0con0code.mem test.code bram.mtx~
  476. FoxTRMTools.GenerateTestFile --random --size=4096 TestBRAM0con0code.mem ~
  477. FoxTRMTools.SplitFiles --blockSize=512 --blocks=8 --patchSpartan6 TestBRAM0con0code.mem ~
  478. WinApplications.Run "testbram.bat" ~
  479. UARTPC.DumpBRAM 6 0 8192 "bram.dat" ~
  480. FoxTRMTools.GenerateTestFile --sourceFile=bram.dat test.code ~
  481. PET.Open -e TestBRAM0con0code.mem test.code ~
  482. FoxTRMTools.CompareFiles TestBRAM0con0code.mem test.code bram.mtx~
  483. FoxTRMTools.GenerateTestFile --random --size=4096 TestBRAM0con0code.mem ~
  484. FoxTRMTools.SplitFiles --blockSize=512 --blocks=8 --patchSpartan6 TestBRAM0con0code.mem ~
  485. WinApplications.Run "testbram.bat" ~
  486. UARTPC.DumpBRAM 6 0 8192 "bram.dat" ~
  487. FoxTRMTools.GenerateTestFile --sourceFile=bram.dat test.code ~
  488. PET.Open -e TestBRAM0con0code.mem test.code ~
  489. FoxTRMTools.CompareFiles TestBRAM0con0code.mem test.code bram.mtx~
  490. FoxTRMTools.GenerateTestFile --random --size=4096 TestBRAM0con0code.mem ~
  491. FoxTRMTools.SplitFiles --blockSize=512 --blocks=8 --patchSpartan6 TestBRAM0con0code.mem ~
  492. WinApplications.Run "testbram.bat" ~
  493. UARTPC.DumpBRAM 6 0 8192 "bram.dat" ~
  494. FoxTRMTools.GenerateTestFile --sourceFile=bram.dat test.code ~
  495. PET.Open -e TestBRAM0con0code.mem test.code ~
  496. FoxTRMTools.CompareFiles TestBRAM0con0code.mem test.code bram.mtx~
  497. FoxTRMTools.GenerateTestFile --random --size=4096 TestBRAM0con0code.mem ~
  498. FoxTRMTools.SplitFiles --blockSize=512 --blocks=8 --patchSpartan6 TestBRAM0con0code.mem ~
  499. WinApplications.Run "testbram.bat" ~
  500. UARTPC.DumpBRAM 6 0 8192 "bram.dat" ~
  501. FoxTRMTools.GenerateTestFile --sourceFile=bram.dat test.code ~
  502. PET.Open -e TestBRAM0con0code.mem test.code ~
  503. FoxTRMTools.CompareFiles TestBRAM0con0code.mem test.code bram.mtx~
  504. FoxTRMTools.GenerateTestFile --random --size=4096 TestBRAM0con0code.mem ~
  505. FoxTRMTools.SplitFiles --blockSize=512 --blocks=8 --patchSpartan6 TestBRAM0con0code.mem ~
  506. WinApplications.Run "testbram.bat" ~
  507. UARTPC.DumpBRAM 6 0 8192 "bram.dat" ~
  508. FoxTRMTools.GenerateTestFile --sourceFile=bram.dat test.code ~
  509. PET.Open -e TestBRAM0con0code.mem test.code ~
  510. FoxTRMTools.CompareFiles TestBRAM0con0code.mem test.code bram.mtx~
  511. System.Show "DONE!" ~
  512. ~
  513. System.DoCommands
  514. FoxTRMTools.GenerateTestFile --random --size=512 TestBRAM0con0code.mem ~
  515. FoxTRMTools.SplitFiles --blockSize=512 --blocks=1 --patchSpartan6 TestBRAM0con0code.mem ~
  516. WinApplications.Run "testbram.bat" ~
  517. UARTPC.DumpBRAM 6 0 1024 "bram.dat" ~
  518. FoxTRMTools.GenerateTestFile --sourceFile=bram.dat test.code ~
  519. PET.Open -e TestBRAM0con0code.mem test.code ~
  520. FoxTRMTools.CompareFiles TestBRAM0con0code.mem test.code bram.mtx~
  521. ~
  522. M = {};
  523. file =fopen('bram.mtx')
  524. A = fscanf(file,'%d');
  525. fclose(file)
  526. A = reshape(A,16,16);
  527. M{numel(M)+1}=A;