You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

929 lines
29 KiB

3 years ago
  1. var eqnType = 0;
  2. var spcStr = " ";
  3. var nlStr = "<br>";
  4. var tabStr = spcStr + spcStr + spcStr + spcStr + spcStr;
  5. var nlTabStr = nlStr + tabStr;
  6. var rClrS = "<font color='blue'>";
  7. var rClrE = "</font>";
  8. var cClrS = "<font color='green'>";
  9. var cClrE = "</font>";
  10. var abelOper = new Array();
  11. abelOper["GND"] = new Array("Gnd");
  12. abelOper["VCC"] = new Array("Vcc");
  13. abelOper["NOT"] = new Array(rClrS + "!" + rClrE);
  14. abelOper["AND"] = new Array(rClrS + "&" + rClrE);
  15. abelOper["OR"] = new Array(rClrS + "#" + rClrE);
  16. abelOper["XOR"] = new Array(rClrS + "$" + rClrE);
  17. abelOper["EQUAL_COLON"] = new Array(":= ");
  18. abelOper["EQUAL"] = new Array("= ");
  19. abelOper["ASSIGN"] = new Array("");
  20. abelOper["OPEN_NEGATE"] = new Array("(");
  21. abelOper["CLOSE_NEGATE"] = new Array(")");
  22. abelOper["OPEN_PTERM"] = new Array("");
  23. abelOper["CLOSE_PTERM"] = new Array("");
  24. abelOper["OPEN_BRACE"] = new Array("<");
  25. abelOper["CLOSE_BRACE"] = new Array(">");
  26. abelOper["INVALID_OPEN_BRACE"] = new Array("<");
  27. abelOper["INVALID_CLOSE_BRACE"] = new Array(">");
  28. abelOper["ENDLN"] = new Array(";");
  29. abelOper["COMMENT"] = new Array("//");
  30. abelOper["IMPORT"] = new Array(";Imported pterms ");
  31. abelOper["GCK_COM"] = new Array("GCK");
  32. abelOper["GTS_COM"] = new Array("GTS");
  33. abelOper["GSR_COM"] = new Array("GSR");
  34. abelOper["OD_COM"] = new Array("Open Drain");
  35. abelOper["START_EQN"] = new Array("");
  36. abelOper["END_EQN"] = new Array("");
  37. abelOper["_I"] = new Array(".I");
  38. abelOper["_T"] = new Array(".T");
  39. abelOper["_D"] = new Array(".D");
  40. abelOper["_C"] = new Array(".CLK");
  41. abelOper["_DEC"] = new Array(".DEC");
  42. abelOper["_LH"] = new Array(".LH");
  43. abelOper["_CLR"] = new Array(".AR");
  44. abelOper["_PRE"] = new Array(".AP");
  45. abelOper["_CE"] = new Array(".CE");
  46. abelOper["_OE"] = new Array(".OE");
  47. abelOper["OE_START"] = new Array(" <= ");
  48. abelOper["OE_WHEN"] = new Array(" when ");
  49. abelOper["OE_EQUAL"] = new Array(" = ");
  50. abelOper["OE_ELSE"] = new Array(" else ");
  51. abelOper["B0"] = new Array("'0'");
  52. abelOper["B1"] = new Array("'1'");
  53. abelOper["BZ"] = new Array("'Z'");
  54. abelOper["FD"] = new Array(".D");
  55. abelOper["FT"] = new Array(".T");
  56. abelOper["FDD"] = new Array(".DEC");
  57. abelOper["FTD"] = new Array(".T");
  58. abelOper["LD"] = new Array(".LH");
  59. abelOper["Q"] = new Array(".Q");
  60. var vhdlOper = new Array();
  61. vhdlOper["GND"] = new Array("'0'");
  62. vhdlOper["VCC"] = new Array("'1'");
  63. vhdlOper["NOT"] = new Array(rClrS + "NOT " + rClrE);
  64. vhdlOper["AND"] = new Array(rClrS + "AND" + rClrE);
  65. vhdlOper["OR"] = new Array(rClrS + "OR" + rClrE);
  66. vhdlOper["XOR"] = new Array(rClrS + "XOR" + rClrE);
  67. vhdlOper["EQUAL_COLON"] = new Array("<= ");
  68. vhdlOper["EQUAL"] = new Array("<= ");
  69. vhdlOper["ASSIGN"] = new Array("");
  70. vhdlOper["OPEN_NEGATE"] = new Array("(");
  71. vhdlOper["CLOSE_NEGATE"] = new Array(")");
  72. vhdlOper["OPEN_PTERM"] = new Array("(");
  73. vhdlOper["CLOSE_PTERM"] = new Array(")");
  74. vhdlOper["OPEN_BRACE"] = new Array("(");
  75. vhdlOper["CLOSE_BRACE"] = new Array(")");
  76. vhdlOper["INVALID_OPEN_BRACE"] = new Array("<");
  77. vhdlOper["INVALID_CLOSE_BRACE"] = new Array(">");
  78. vhdlOper["ENDLN"] = new Array(";");
  79. vhdlOper["COMMENT"] = new Array("--");
  80. vhdlOper["IMPORT"] = new Array("");
  81. vhdlOper["GCK_COM"] = new Array("GCK");
  82. vhdlOper["GTS_COM"] = new Array("GTS");
  83. vhdlOper["GSR_COM"] = new Array("GSR");
  84. vhdlOper["OD_COM"] = new Array("Open Drain");
  85. vhdlOper["START_EQN"] = new Array(rClrS + "port map" + rClrE + " (");
  86. vhdlOper["END_EQN"] = new Array(")");
  87. vhdlOper["_I"] = new Array("_I");
  88. vhdlOper["_T"] = new Array("_T");
  89. vhdlOper["_D"] = new Array("_D");
  90. vhdlOper["_C"] = new Array("_C");
  91. vhdlOper["_DEC"] = new Array("_C");
  92. vhdlOper["_LH"] = new Array("_C");
  93. vhdlOper["_CLR"] = new Array("_CLR");
  94. vhdlOper["_PRE"] = new Array("_PRE");
  95. vhdlOper["_CE"] = new Array("_CE");
  96. vhdlOper["_OE"] = new Array("_OE");
  97. vhdlOper["OE_START"] = new Array(" <= ");
  98. vhdlOper["OE_WHEN"] = new Array(" when ");
  99. vhdlOper["OE_EQUAL"] = new Array(" = ");
  100. vhdlOper["OE_ELSE"] = new Array(" else ");
  101. vhdlOper["B0"] = new Array("'0'");
  102. vhdlOper["B1"] = new Array("'1'");
  103. vhdlOper["BZ"] = new Array("'Z'");
  104. vhdlOper["FD"] = new Array("FDCPE");
  105. vhdlOper["FT"] = new Array("FTCPE");
  106. vhdlOper["FDD"] = new Array("FDDCPE");
  107. vhdlOper["FTD"] = new Array("FTDCPE");
  108. vhdlOper["LD"] = new Array("LDCP");
  109. vhdlOper["Q"] = new Array("");
  110. var verOper = new Array();
  111. verOper["GND"] = new Array("1'b0");
  112. verOper["VCC"] = new Array("1'b1");
  113. verOper["NOT"] = new Array(rClrS + "!" + rClrE);
  114. verOper["AND"] = new Array(rClrS + "&&" + rClrE);
  115. verOper["OR"] = new Array(rClrS + "||" + rClrE);
  116. verOper["XOR"] = new Array(rClrS + "XOR" + rClrE);
  117. verOper["EQUAL_COLON"] = new Array("= ");
  118. verOper["EQUAL"] = new Array("= ");
  119. verOper["ASSIGN"] = new Array("assign ");
  120. verOper["OPEN_NEGATE"] = new Array("(");
  121. verOper["CLOSE_NEGATE"] = new Array(")");
  122. verOper["OPEN_PTERM"] = new Array("(");
  123. verOper["CLOSE_PTERM"] = new Array(")");
  124. verOper["OPEN_BRACE"] = new Array("[");
  125. verOper["CLOSE_BRACE"] = new Array("]");
  126. verOper["INVALID_OPEN_BRACE"] = new Array("<");
  127. verOper["INVALID_CLOSE_BRACE"] = new Array(">");
  128. verOper["ENDLN"] = new Array(";");
  129. verOper["COMMENT"] = new Array("//");
  130. verOper["IMPORT"] = new Array("");
  131. verOper["GCK_COM"] = new Array("GCK");
  132. verOper["GTS_COM"] = new Array("GTS");
  133. verOper["GSR_COM"] = new Array("GSR");
  134. verOper["OD_COM"] = new Array("Open Drain");
  135. verOper["START_EQN"] = new Array(" (");
  136. verOper["END_EQN"] = new Array(")");
  137. verOper["_I"] = new Array("_I");
  138. verOper["_T"] = new Array("_T");
  139. verOper["_D"] = new Array("_D");
  140. verOper["_C"] = new Array("_C");
  141. verOper["_DEC"] = new Array("_C");
  142. verOper["_LH"] = new Array("_C");
  143. verOper["_CLR"] = new Array("_CLR");
  144. verOper["_PRE"] = new Array("_PRE");
  145. verOper["_CE"] = new Array("_CE");
  146. verOper["_OE"] = new Array("_OE");
  147. verOper["OE_START"] = new Array(" = ");
  148. verOper["OE_WHEN"] = new Array(" ? ");
  149. verOper["OE_EQUAL"] = new Array("");
  150. verOper["OE_ELSE"] = new Array(" : ");
  151. verOper["B0"] = new Array("1'b0");
  152. verOper["B1"] = new Array("1'b1");
  153. verOper["BZ"] = new Array("1'bz");
  154. verOper["FD"] = new Array("FDCPE");
  155. verOper["FT"] = new Array("FTCPE");
  156. verOper["FDD"] = new Array("FDDCPE");
  157. verOper["FTD"] = new Array("FTDCPE");
  158. verOper["LD"] = new Array("LDCP");
  159. verOper["Q"] = new Array("");
  160. var operator = abelOper;
  161. var pterms = new Array();
  162. var d1 = new Array();
  163. var d2 = new Array();
  164. var clk = new Array();
  165. var set = new Array();
  166. var rst = new Array();
  167. var trst = new Array();
  168. var d1imp = new Array();
  169. var d2imp = new Array();
  170. var clkimp = new Array();
  171. var setimp = new Array();
  172. var rstimp = new Array();
  173. var trstimp = new Array();
  174. var gblclk = new Array();
  175. var gblset = new Array();
  176. var gblrst = new Array();
  177. var gbltrst = new Array();
  178. var ce = new Array();
  179. var ceimp = new Array();
  180. var prld = new Array();
  181. var specSig = new Array();
  182. var clkNegs = new Array();
  183. var setNegs = new Array();
  184. var rstNegs = new Array();
  185. var trstNegs = new Array();
  186. var ceNegs = new Array();
  187. var fbnand = new Array();
  188. var inreg = new Array();
  189. var iostyle = new Array();
  190. var dOneLit = true;
  191. function setOper(type) {
  192. if (type == "1") { operator = vhdlOper; eqnType = 1; }
  193. else if (type == "2") { operator = verOper; eqnType = 2; }
  194. else { operator = abelOper; eqnType = 0; }
  195. }
  196. function isXC95() {
  197. if (device.indexOf("95") != -1) return true;
  198. return false;
  199. }
  200. function is9500() {
  201. if ((device.indexOf("95") != -1) &&
  202. (device.indexOf("XL") == -1) &&
  203. (device.indexOf("XV") == -1)) return true;
  204. return false;
  205. }
  206. function retSigType(s) {
  207. var sigType = sigTypes[s];
  208. var str = operator["Q"];
  209. if (sigType == "D") str = operator["FD"];
  210. else if (sigType == "T") str = operator["FT"];
  211. else if (sigType.indexOf("LATCH") != -1) str = operator["LD"];
  212. else if (sigType.indexOf("DDEFF") != -1) str = operator["FDD"];
  213. else if (sigType.indexOf("DEFF") != -1) str = operator["FD"];
  214. else if (sigType.indexOf("DDFF") != -1) str = operator["FDD"];
  215. else if (sigType.indexOf("TDFF") != -1) str = operator["FTD"];
  216. else if (sigType.indexOf("DFF") != -1) str = operator["FD"];
  217. else if (sigType.indexOf("TFF") != -1) str = operator["FT"];
  218. return str;
  219. }
  220. function retSigIndex(signal) {
  221. for (s=0; s<signals.length; s++) { if (signals[s] == signal) return s; }
  222. return -1;
  223. }
  224. function retSigName(signal) {
  225. var str = "";
  226. if (specSig[signal]) str += specSig[signal];
  227. else str += signal;
  228. var idx1 = str.indexOf(operator["INVALID_OPEN_BRACE"]);
  229. var idx2 = str.indexOf(operator["INVALID_CLOSE_BRACE"]);
  230. if ((idx1 != -1) && (idx2 != -1))
  231. str = str.substring(0,idx1) + operator["OPEN_BRACE"] +
  232. str.substring(idx1+1,idx2) + operator["CLOSE_BRACE"] +
  233. str.substring(idx2+1,str.length);
  234. return str;
  235. }
  236. function removePar(signal) {
  237. var str = signal;
  238. var idx = str.indexOf(operator["OPEN_BRACE"]);
  239. if (idx != -1)
  240. str = str.substring(0,idx) +
  241. str.substring(idx+1,str.indexOf(operator["CLOSE_BRACE"]));
  242. return str;
  243. }
  244. function isOneLiteral(str) {
  245. if ((str.indexOf(operator["AND"]) != -1) ||
  246. (str.indexOf(operator["OR"]) != -1) ||
  247. (str.indexOf(operator["XOR"]) != -1)) return false;
  248. return true;
  249. }
  250. function updateName(signal, index) {
  251. var str;
  252. var idx = signal.indexOf(operator["OPEN_BRACE"]);
  253. if (idx != -1)
  254. str = signal.substring(0,idx) +
  255. index + signal.substring(idx);
  256. else str = signal + index;
  257. return str;
  258. }
  259. function retPterm(pt) {
  260. var str = "";
  261. if (!pterms[pt]) {
  262. if (specSig[pt]) pt = specSig[pt];
  263. return pt;
  264. }
  265. if (pterms[pt].length > 1) str += operator["OPEN_PTERM"];
  266. for (p=0; p<pterms[pt].length; p++) {
  267. var sig = pterms[pt][p];
  268. if (sig.indexOf("xPUP_0") != -1) continue;
  269. if (p>0) str += " " + operator["AND"] + " ";
  270. var neg = 0;
  271. if (sig.indexOf("/") != -1) {
  272. sig = sig.substring(1, sig.length);
  273. str += operator["NOT"];
  274. neg = 1;
  275. }
  276. str += retSigName(sig);
  277. }
  278. if (pterms[pt].length > 1) str += operator["CLOSE_PTERM"];
  279. return str;
  280. }
  281. function retFBMC(str) {
  282. return str.substring(0,str.length-2) + nlStr + tabStr;
  283. }
  284. function retD1D2(signal) {
  285. var str = "";
  286. dOneLit = true;
  287. if (d1[signal]) {
  288. var currImp = "";
  289. for (i=0; i<d1[signal].length; i++) {
  290. if (!eqnType && d1imp[signal] && (d1imp[signal][i] == "1")) {
  291. if ((currImp != retFBMC(d1[signal][i])) &&
  292. (d1[signal][i].indexOf("FB") == 0)) {
  293. currImp = retFBMC(d1[signal][i]);
  294. str += nlStr + operator["IMPORT"] + currImp;
  295. }
  296. }
  297. if (i>0) str += nlTabStr + operator["OR"] + spcStr;
  298. str += retPterm(d1[signal][i]);
  299. }
  300. if (d2[signal]) str += nlTabStr + operator["XOR"]+ spcStr;
  301. }
  302. if (d2[signal]) {
  303. var currImp = "";
  304. for (i=0; i<d2[signal].length; i++) {
  305. if (!eqnType && d2imp[signal] && (d2imp[signal][i] == "1")) {
  306. if ((currImp != retFBMC(d2[signal][i])) &&
  307. (d2[signal][i].indexOf("FB") == 0)) {
  308. currImp = retFBMC(d2[signal][i]);
  309. str += nlStr + operator["IMPORT"] + currImp;
  310. }
  311. }
  312. if (i>0) str += nlTabStr + operator["OR"] + spcStr;
  313. str += retPterm(d2[signal][i]);
  314. }
  315. }
  316. if (str == "GND") str = operator["GND"];
  317. else if (str == "VCC") str = operator["VCC"];
  318. else if (!isOneLiteral(str)) {
  319. dOneLit = false;
  320. var type = retSigType(retSigIndex(signal));
  321. if ((type == operator["FD"]) ||
  322. (type == operator["FDD"])) type = operator["_D"];
  323. else if ((type == operator["FT"]) ||
  324. (type == operator["FTD"])) type = operator["_T"];
  325. else if (type == operator["LD"] && eqnType) type = "_D";
  326. var tmpStr = updateName(retSigName(signal), type);
  327. tmpStr += spcStr + operator["EQUAL_COLON"];
  328. var idx = retSigIndex(signal);
  329. if (eqnType && sigNegs[idx] == "ON") tmpStr += operator["NOT"] + operator["OPEN_NEGATE"];
  330. str = tmpStr + str;
  331. if (eqnType && sigNegs[idx] == "ON") str += operator["CLOSE_NEGATE"];
  332. str += operator["ENDLN"];
  333. }
  334. return str;
  335. }
  336. function retClk(signal) {
  337. var str = "";
  338. if (clk[signal]) {
  339. if (clk[signal].length == 1) {
  340. var pterm = retPterm(clk[signal][0]);
  341. if (clkNegs[signal]) {
  342. str += operator["NOT"];
  343. if (!isOneLiteral(pterm)) str += operator["OPEN_NEGATE"];
  344. }
  345. str += pterm;
  346. if (clkNegs[signal] && !isOneLiteral(pterm)) str += operator["CLOSE_NEGATE"];
  347. }
  348. else {
  349. if (clkNegs[signal]) str += operator["NOT"] + operator["OPEN_NEGATE"];
  350. var currImp = "";
  351. for (i=0; i<clk[signal].length; i++) {
  352. if (!eqnType && clkimp[signal] && (clkimp[signal][i] == "1")) {
  353. if ((currImp != retFBMC(clk[signal][i])) &&
  354. (clk[signal][i].indexOf("FB") == 0)) {
  355. currImp = retFBMC(clk[signal][i]);
  356. str += nlStr + operator["IMPORT"] + currImp;
  357. }
  358. }
  359. if (i>0) str += nlTabStr + operator["OR"] + spcStr;
  360. str += retPterm(clk[signal][i]);
  361. }
  362. if (clkNegs[signal]) str += operator["CLOSE_NEGATE"];
  363. str += operator["ENDLN"];
  364. }
  365. }
  366. else if (gblclk[signal]) {
  367. if (gblclk[signal].length == 1) {
  368. var pterm = retPterm(gblclk[signal][0]);
  369. if (clkNegs[signal]) {
  370. str += operator["NOT"];
  371. if (!isOneLiteral(pterm)) str += operator["OPEN_NEGATE"];
  372. }
  373. str += pterm;
  374. if (clkNegs[signal] && !isOneLiteral(pterm)) str += operator["CLOSE_NEGATE"];
  375. }
  376. else {
  377. if (clkNegs[signal]) str += operator["NOT"] + operator["OPEN_NEGATE"];
  378. for (i=0; i<gblclk[signal].length; i++) {
  379. if (i>0) str += nlTabStr + operator["OR"] + spcStr;
  380. str += retPterm(gblclk[signal][i]);
  381. }
  382. if (clkNegs[signal]) str += operator["CLOSE_NEGATE"];
  383. str += operator["ENDLN"] + tabStr + cClrS +
  384. operator["COMMENT"] + spcStr + operator["GCK_COM"] + cClrE;
  385. }
  386. }
  387. else if (eqnType) str += operator["B0"];
  388. return str;
  389. }
  390. function retRst(signal) {
  391. var str = "";
  392. if (rst[signal]) {
  393. if (rst[signal].length == 1) {
  394. var currImp;
  395. if (!eqnType && rstimp[signal] && (rstimp[signal][0] == "1")) {
  396. if ((currImp != retFBMC(rst[signal][i])) &&
  397. (rst[signal][i].indexOf("FB") == 0)) {
  398. currImp = retFBMC(rst[signal][0]);
  399. str += nlStr + operator["IMPORT"] + currImp;
  400. }
  401. }
  402. if (rstNegs[signal]) str += operator["NOT"];
  403. str += retPterm(rst[signal][0]);
  404. }
  405. else {
  406. var currImp = "";
  407. if (rstNegs[signal]) str += operator["NOT"] + operator["OPEN_NEGATE"];
  408. for (i=0; i<rst[signal].length; i++) {
  409. if (!eqnType && rstimp[signal] && (rstimp[signal][i] == "1")) {
  410. if ((currImp != retFBMC(rst[signal][i])) &&
  411. (rst[signal][i].indexOf("FB") == 0)) {
  412. currImp = retFBMC(rst[signal][i]);
  413. str += nlStr + operator["IMPORT"] + currImp;
  414. }
  415. }
  416. if (i>0) str += nlTabStr + operator["OR"] + spcStr;
  417. str += retPterm(rst[signal][i]);
  418. }
  419. if (rstNegs[signal]) str += operator["CLOSE_NEGATE"];
  420. str += operator["ENDLN"];
  421. }
  422. }
  423. else if (gblrst[signal]) {
  424. if (gblrst[signal].length == 1) {
  425. if (rstNegs[signal]) str += operator["NOT"];
  426. str += retPterm(gblrst[signal][0]);
  427. }
  428. else {
  429. if (rstNegs[signal]) str += operator["NOT"] + operator["OPEN_NEGATE"];
  430. for (i=0; i<gblrst[signal].length; i++) {
  431. if (i>0) str += nlTabStr + operator["OR"] + spcStr;
  432. str += retPterm(gblrst[signal][i]);
  433. }
  434. if (rstNegs[signal]) str += operator["CLOSE_NEGATE"];
  435. str += operator["ENDLN"] + tabStr + cClrS +
  436. operator["COMMENT"] + spcStr + operator["GSR_COM"] + cClrE;
  437. }
  438. }
  439. else if (eqnType) str += operator["B0"];
  440. return str;
  441. }
  442. function retSet(signal) {
  443. var str = "";
  444. if (set[signal]) {
  445. if (set[signal].length == 1) {
  446. var currImp = "";
  447. if (!eqnType && setimp[signal] && (setimp[signal][0] == "1")) {
  448. if ((currImp != retFBMC(set[signal][i])) &&
  449. (set[signal][i].indexOf("FB") == 0)) {
  450. currImp = retFBMC(set[signal][0]);
  451. str += nlStr + operator["IMPORT"] + currImp;
  452. }
  453. }
  454. if (setNegs[signal]) str += operator["NOT"];
  455. str += retPterm(set[signal][0]);
  456. }
  457. else {
  458. var currImp = "";
  459. if (setNegs[signal]) str += operator["NOT"] + operator["OPEN_NEGATE"];
  460. for (i=0; i<set[signal].length; i++) {
  461. if (!eqnType && setimp[signal] && (setimp[signal][i] == "1")) {
  462. if ((currImp != retFBMC(set[signal][i])) &&
  463. (set[signal][i].indexOf("FB") == 0)) {
  464. currImp = retFBMC(set[signal][i]);
  465. str += nlStr + operator["IMPORT"] + currImp;
  466. }
  467. }
  468. if (i>0) str += nlTabStr + operator["OR"] + spcStr;
  469. str += retPterm(set[signal][i]);
  470. }
  471. if (setNegs[signal]) str += operator["CLOSE_NEGATE"];
  472. str += operator["ENDLN"];
  473. }
  474. }
  475. else if (gblset[signal]) {
  476. if (gblset[signal].length == 1) {
  477. if (setNegs[signal]) str += operator["NOT"];
  478. str += retPterm(gblset[signal][0]);
  479. }
  480. else {
  481. if (setNegs[signal]) str += operator["NOT"] + operator["OPEN_NEGATE"];
  482. for (i=0; i<gblset[signal].length; i++) {
  483. if (i>0) str += nlTabStr + operator["OR"] + spcStr;
  484. str += retPterm(gblset[signal][i]);
  485. }
  486. if (setNegs[signal]) str += operator["CLOSE_NEGATE"];
  487. str += operator["ENDLN"] + tabStr + cClrS +
  488. operator["COMMENT"] + spcStr + operator["GSR_COM"] + cClrE;
  489. }
  490. }
  491. else if (eqnType) str += operator["B0"];
  492. return str;
  493. }
  494. function retCE(signal) {
  495. var str = "";
  496. if (ce[signal]) {
  497. if (ce[signal].length == 1) {
  498. var currImp = "";
  499. if (!eqnType && ceimp[signal] && (ceimp[signal][0] == "1")) {
  500. if ((currImp != retFBMC(ce[signal][i])) &&
  501. (ce[signal][i].indexOf("FB") == 0)) {
  502. currImp = retFBMC(ce[signal][0]);
  503. str += nlStr + operator["IMPORT"] + currImp;
  504. }
  505. }
  506. if (ceNegs[signal]) str += operator["NOT"];
  507. str += retPterm(ce[signal][0]);
  508. }
  509. else {
  510. var currImp = "";
  511. if (ceNegs[signal]) str += operator["NOT"] + operator["OPEN_NEGATE"];
  512. for (i=0; i<ce[signal].length; i++) {
  513. if (!eqnType && ceimp[signal] && (ceimp[signal][i] == "1")) {
  514. if ((currImp != retFBMC(ce[signal][i])) &&
  515. (ce[signal][i].indexOf("FB") == 0)) {
  516. currImp = retFBMC(ce[signal][i]);
  517. str += nlStr + operator["IMPORT"] + currImp;
  518. }
  519. }
  520. if (i>0) str += nlTabStr + operator["OR"] + spcStr;
  521. str += retPterm(ce[signal][i]);
  522. }
  523. if (ceNegs[signal]) str += operator["CLOSE_NEGATE"];
  524. str += operator["ENDLN"];
  525. }
  526. }
  527. else if (eqnType) str += operator["B1"];
  528. return str;
  529. }
  530. function retTrst(signal) {
  531. var str = "";
  532. if (trst[signal]) {
  533. if (trstNegs[signal])
  534. str += operator["NOT"] + operator["OPEN_NEGATE"];
  535. for (i=0; i<trst[signal].length; i++) {
  536. var currImp = "";
  537. if (!eqnType && trstimp[signal] && (trstimp[signal][0] == "1")) {
  538. if ((currImp != retFBMC(trst[signal][i])) &&
  539. (trst[signal][i].indexOf("FB") == 0)) {
  540. currImp = retFBMC(trst[signal][0]);
  541. str += nlStr + operator["IMPORT"] + currImp;
  542. }
  543. }
  544. if (i>0) str += nlTabStr + operator["OR"] + spcStr;
  545. str += retPterm(trst[signal][i]);
  546. }
  547. if (trstNegs[signal]) str += operator["CLOSE_NEGATE"];
  548. }
  549. else if (gbltrst[signal]) {
  550. if (trstNegs[signal])
  551. str += operator["NOT"] + operator["OPEN_NEGATE"];
  552. for (i=0; i<gbltrst[signal].length; i++) {
  553. if (i>0) str += nlTabStr + operator["OR"] + spcStr;
  554. str += retPterm(gbltrst[signal][i]);
  555. }
  556. if (trstNegs[signal]) str += operator["CLOSE_NEGATE"];
  557. }
  558. str += operator["ENDLN"];
  559. return str;
  560. }
  561. function retEqn(signal) {
  562. var str = inregStr = "";
  563. var iStr = qStr = "";
  564. var dStr = dEqn = "";
  565. var cStr = cEqn = "";
  566. var clrStr = clrEqn = "";
  567. var preStr = preEqn = "";
  568. var ceStr = ceEqn = "";
  569. var oeStr = oeEqn = "";
  570. var sigName = retSigName(signal);
  571. var type = retSigType(retSigIndex(signal));
  572. if (gbltrst[signal] || trst[signal]) iStr = operator["_I"];
  573. if (eqnType) qStr = updateName(sigName, iStr);
  574. if (inreg[signal]) {
  575. if (!eqnType)
  576. inregStr = operator["COMMENT"] + " Direct Input Register" + nlStr;
  577. dStr = retSigName(inreg[signal][0]);
  578. }
  579. else dStr = retD1D2(signal);
  580. if (eqnType && !dOneLit) {
  581. dEqn = dStr;
  582. dStr = dStr.substring(0,dStr.indexOf(operator["EQUAL_COLON"]));
  583. }
  584. else if (!eqnType) {
  585. if (!dOneLit) dStr = dStr.substring(dStr.indexOf(operator["EQUAL_COLON"])+2);
  586. if (sigNegs[retSigIndex(signal)] == "ON") dEqn += operator["NOT"];
  587. dEqn += sigName;
  588. if ((type == operator["FT"]) ||
  589. (type == operator["FTD"])) dEqn += operator["_T"];
  590. else if ((type == operator["FD"]) ||
  591. (type == operator["FTD"])||
  592. (type == operator["LD"])) dEqn += operator["_D"];
  593. dEqn += " ";
  594. if ((type != operator["Q"]) && (type != operator["LD"]))
  595. dEqn += operator["EQUAL_COLON"];
  596. else dEqn += operator["EQUAL"];
  597. dEqn += dStr;
  598. if (dOneLit) {
  599. dEqn += operator["ENDLN"];
  600. if (iostyle[signal] && iostyle[signal].indexOf("OD"))
  601. dEqn += tabStr + operator["COMMENT"] + " " + operator["OD_COM"];
  602. }
  603. }
  604. cStr = retClk(signal);
  605. if (eqnType && !isOneLiteral(cStr)){
  606. cEqn = cStr;
  607. if (cEqn.indexOf(operator["ENDLN"]) == -1)
  608. cEqn += operator["ENDLN"];
  609. cStr = updateName(sigName, operator["_C"]);
  610. }
  611. else if (!eqnType && cStr) {
  612. cEqn += cStr;
  613. cStr = tabStr + sigName;
  614. if (type == operator["LD"]) cStr += operator["_LH"];
  615. else if (type == operator["FDD"]) cStr += operator["_DEC"];
  616. else cStr += operator["_C"];
  617. if (cEqn.indexOf(operator["ENDLN"]) == -1)
  618. cEqn += operator["ENDLN"];
  619. if (gblclk[signal]) cEqn += tabStr + operator["COMMENT"] + " " + operator["GCK_COM"];
  620. }
  621. clrStr = retRst(signal);
  622. if (eqnType && !isOneLiteral(clrStr)){
  623. clrEqn = clrStr;
  624. if (cEqn.indexOf(operator["ENDLN"]) == -1)
  625. clrEqn += operator["ENDLN"];
  626. clrStr = updateName(sigName, operator["_CLR"]);
  627. }
  628. else if (!eqnType && clrStr) {
  629. clrEqn += clrStr;
  630. clrStr = tabStr + sigName + operator["_CLR"];
  631. if (clrEqn.indexOf(operator["ENDLN"]) == -1)
  632. clrEqn += operator["ENDLN"];
  633. if (gblrst[signal]) clrEqn += tabStr + operator["COMMENT"] + " " + operator["GSR_COM"];
  634. }
  635. preStr = retSet(signal);
  636. if (eqnType && !isOneLiteral(preStr)){
  637. preEqn = preStr;
  638. if (cEqn.indexOf(operator["ENDLN"]) == -1)
  639. preEqn += operator["ENDLN"];
  640. preStr = updateName(sigName, operator["_PRE"]);
  641. }
  642. else if (!eqnType && preStr) {
  643. preEqn += preStr;
  644. preStr = tabStr + sigName + operator["_PRE"];
  645. if (preEqn.indexOf(operator["ENDLN"]) == -1)
  646. preEqn += operator["ENDLN"];
  647. if (gblset[signal]) preEqn += tabStr + operator["COMMENT"] + " " + operator["GSR_COM"];
  648. }
  649. if (!is9500()) {
  650. ceStr = retCE(signal);
  651. if (eqnType && !isOneLiteral(ceStr)){
  652. ceEqn = ceStr;
  653. if (cEqn.indexOf(operator["ENDLN"]) == -1)
  654. ceEqn += operator["ENDLN"];
  655. ceStr = updateName(sigName, operator["_CE"]);
  656. }
  657. else if (!eqnType && ceStr) {
  658. ceEqn += ceStr;
  659. ceStr = tabStr + sigName + operator["_CE"];
  660. if (ceEqn.indexOf(operator["ENDLN"]) == -1)
  661. ceEqn += operator["ENDLN"];
  662. }
  663. }
  664. if (eqnType && gbltrst[signal]) oeEqn = retTrst(signal);
  665. else if (!eqnType && (trst[signal] || gbltrst[signal])) oeEqn = retTrst(signal);
  666. var newline = false;
  667. if ((type == "") && (clrStr == "")) {
  668. str += operator["ASSIGN"] + qStr + " " + operator["EQUAL"];
  669. if (dOneLit) str += dStr;
  670. else str += dEqn.substring(dEqn.indexOf(operator["EQUAL"])+2);
  671. if (oeEqn != "") {
  672. var oeStr = updateName(sigName, operator["_OE"]);
  673. if (eqnType == 1) {
  674. str += nlStr + sigName + operator["OE_START"] + qStr + operator["OE_WHEN"] + oeStr +
  675. operator["OE_EQUAL"] + operator["B1"] + operator["OE_ELSE"] +
  676. operator["OE_EQUAL"] + operator["BZ"] + operator["ENDLN"];
  677. }
  678. else if (eqnType == 2) {
  679. str += nlStr + operator["ASSIGN"] + sigName + operator["OE_START"] +
  680. oeStr + operator["OE_WHEN"] + qStr +
  681. operator["OE_ELSE"] + operator["BZ"] + operator["ENDLN"];
  682. }
  683. str += nlStr + operator["ASSIGN"] + oeStr + " " + operator["EQUAL"] + " " + oeEqn;
  684. }
  685. }
  686. else {
  687. if (eqnType == 1) {
  688. str += type + "_" + removePar(retSigName(signal)) +
  689. ": " + type + " " + operator["START_EQN"] +
  690. qStr + ", " + dStr + ", " + cStr + ", " +
  691. clrStr + ", " + preStr;
  692. if (!is9500() && (type != operator["LD"])) str += ", " + ceStr;
  693. str += operator["END_EQN"] + operator["ENDLN"];
  694. newline = true;
  695. }
  696. else if (eqnType == 2) {
  697. str += type + " " +
  698. type + "_" + removePar(retSigName(signal)) +
  699. operator["START_EQN"] +
  700. qStr + ", " + dStr + ", " + cStr + ", " +
  701. clrStr + ", " + preStr;
  702. if (!is9500() && (type != operator["LD"])) str += ", " + ceStr;
  703. str += operator["END_EQN"] + operator["ENDLN"];
  704. newline = true;
  705. }
  706. if (dEqn != "") {
  707. if (newline) str += nlStr;
  708. if (inregStr) str += inregStr;
  709. str += operator["ASSIGN"] + dEqn;
  710. }
  711. if (cEqn != "") {
  712. if (newline || !eqnType) str += nlStr;
  713. str += operator["ASSIGN"] + cStr + " " + operator["EQUAL"] + " " + cEqn;
  714. }
  715. if (clrEqn != "") {
  716. if (newline || !eqnType) str += nlStr;
  717. str += operator["ASSIGN"] + clrStr + " " + operator["EQUAL"] + " " + clrEqn;
  718. }
  719. if (preEqn != "") {
  720. if (newline || !eqnType) str += nlStr;
  721. str += operator["ASSIGN"] + preStr + " " + operator["EQUAL"] + " " + preEqn;
  722. }
  723. if (ceEqn != "") {
  724. if (newline || !eqnType) str += nlStr;
  725. str += operator["ASSIGN"] + ceStr + " " + operator["EQUAL"] + " " + ceEqn;
  726. }
  727. if (oeEqn != "") {
  728. if (eqnType == 1) {
  729. // var oeStr = updateName(sigName, operator["_OE"]);
  730. var oeStr = sigName;
  731. str += nlStr + sigName + operator["OE_START"] + qStr + operator["OE_WHEN"] + oeStr +
  732. operator["OE_EQUAL"] + operator["B1"] + operator["OE_ELSE"] +
  733. operator["OE_EQUAL"] + operator["BZ"] + operator["ENDLN"];
  734. // str += nlStr + oeStr + " " + operator["EQUAL"] + " " + oeEqn;
  735. }
  736. else if (eqnType == 2) {
  737. // var oeStr = updateName(sigName, operator["_OE"]);
  738. var oeStr = sigName;
  739. str += nlStr + operator["ASSIGN"] + sigName + operator["OE_START"] + oeStr + operator["OE_WHEN"] + qStr +
  740. operator["OE_ELSE"] + operator["BZ"] + operator["ENDLN"];
  741. // str += nlStr + operator["ASSIGN"] + oeStr + " " + operator["EQUAL"] + " " + oeEqn;
  742. }
  743. else {
  744. var oeStr = sigName + operator["_OE"];
  745. if (gbltrst[signal])
  746. oeEqn += tabStr + operator["COMMENT"] + " " + operator["GTS_COM"];
  747. str += nlStr + tabStr + oeStr + " " + operator["EQUAL"] + " " + oeEqn;
  748. }
  749. }
  750. }
  751. if (iostyle[signal] && iostyle[signal].indexOf("OD")) {
  752. if (str.indexOf("//") == -1)
  753. str += tabStr + operator["COMMENT"] + " " + operator["OD_COM"];
  754. }
  755. return str;
  756. }
  757. function retFamily() {
  758. var family = "xc9500";
  759. if (device.indexOf("XC2C") != -1) {
  760. if (device.indexOf("S") != -1) family = "cr2s";
  761. else family = "xbr";
  762. }
  763. else if (device.indexOf("XCR3") != -1) family = "xpla3";
  764. else {
  765. if (device.indexOf("XL") != -1) family = "xc9500xl";
  766. if (device.indexOf("XV") != -1) family = "xc9500xv";
  767. }
  768. return family;
  769. }
  770. function retDesign() { return design; }
  771. function getPterm(pt, type) {
  772. if (type) return type + " = " + retPterm(pt);
  773. return "PT" + pt.substring(pt.indexOf('_')+1,pt.length) + " = " + retPterm(pt);
  774. }
  775. function getPRLDName(prld) {
  776. if (eqnType != 0) return prld;
  777. else if (prld == "VCC") return "S";
  778. return "R";
  779. }
  780. function retFbnand(signal) {
  781. var str = operator["COMMENT"] + spcStr + "Foldback NAND";
  782. str += nlStr + retSigName(signal) + spcStr + operator["EQUAL"] + spcStr;
  783. for (i=0; i<fbnand[signal].length; i++) {
  784. if (i>0) str += nlTabStr + operator["OR"] + spcStr;
  785. str += retPterm(fbnand[signal][i]);
  786. }
  787. return str;
  788. }
  789. function getEqn(signal) { return retEqn(signal); }
  790. function retUimPterm(pt) {
  791. var str = "";
  792. if (!uimPterms[pt]) return pt;
  793. for (p=0; p<uimPterms[pt].length; p++) {
  794. if (p>0) str += spcStr + operator["AND"] + spcStr;
  795. var sig = uimPterms[pt][p];
  796. if (sig.indexOf("/") != -1) sig = sig.substring(1, sig.length);
  797. str += retSigName(sig);
  798. }
  799. return str;
  800. }
  801. function retUimEqn(signal) {
  802. var str = operator["COMMENT"] + spcStr + "FC Node" + nlStr;
  803. var neg = 0;
  804. if (uimSigNegs[s] == "ON") str += operator["NOT"];
  805. str += retSigName(signal) + spcStr + operator["EQUAL"];
  806. str += retUimPterm(signal) + ";";
  807. return str;
  808. }
  809. function retLegend(url) {
  810. var str = "";
  811. if (!eqnType && !isXC95()) {
  812. str = "Legend: " + "&lt;" + "signame" + "&gt;" + ".COMB = combinational node mapped to ";
  813. str += "the same physical macrocell as the FastInput \"signal\" (not logically related)";
  814. }
  815. else if (eqnType) {
  816. str = "Register Legend:";
  817. if (is9500()) {
  818. str += nlTabStr + "FDCPE (Q,D,C,CLR,PRE);";
  819. str += nlTabStr + "FTCPE (Q,D,C,CLR,PRE);";
  820. str += nlTabStr + "LDCP (Q,D,G,CLR,PRE);";
  821. }
  822. else if (retFamily() == "xbr") {
  823. str += nlTabStr + "FDCPE (Q,D,C,CLR,PRE,CE);";
  824. str += nlTabStr + "FDDCPE (Q,D,C,CLR,PRE,CE);";
  825. str += nlTabStr + "FTCPE (Q,D,C,CLR,PRE,CE);";
  826. str += nlTabStr + "FTDCPE (Q,D,C,CLR,PRE,CE);";
  827. str += nlTabStr + "LDCP (Q,D,G,CLR,PRE);";
  828. }
  829. else {
  830. str += nlTabStr + "FDCPE (Q,D,C,CLR,PRE,CE);";
  831. str += nlTabStr + "FTCPE (Q,D,C,CLR,PRE,CE);";
  832. str += nlTabStr + "LDCP (Q,D,G,CLR,PRE);";
  833. }
  834. }
  835. return str;
  836. }