#module prom256x32 (OE1bar,OE2bar,A[8],D[32]) #memory int thl,tlh,ttri; long s[256]; #memory end #function (A) int i,k; if ((VAL(OE1bar) == LOW) && (VAL(OE2bar) == LOW)) { for(i=0,k=0; i < 8 ; i++) k |= ((VAL(A[i]) == HIGH) << i); for(i=0; i < 32; i++) { if (s[k] & (1 << i)) NEW_VAL(D[i], tlh, HIGH); else NEW_VAL(D[i], thl,LOW); } } #function end #function (OE1bar,OE2bar) int i,k; if ((VAL(OE1bar) == LOW) && (VAL(OE2bar) == LOW)) { for(i=0,k=0; i < 8; i++) k |= ((VAL(A[i]) == HIGH) << i); for(i=0; i < 32; i++) { if (s[k] & (1 << i)) NEW_VAL(D[i], tlh, HIGH); else NEW_VAL(D[i], thl,LOW); } } else for(i=0; i < 32; i++) NEW_VAL(D[i], ttri, TRISTATE); #function end #init begin int i; char line[256]; unsigned long data; FILE* prfile; thl = 150; tlh = 150; ttri = 100; for (i=0;i<256;s[i++]=0); if ((ATTR("filename")) == NULL) lprintf(outfile,"No file for prom %s\n",instance->name); else if ((prfile = fopen(ATTR("filename"),"r")) == NULL) lprintf(outfile,"Could not open %s for prom %s\n", ATTR("filename"),instance->name); else while(fgets(line,256,prfile) != NULL) if (line[0] != ';') { sscanf(line,"%d%x",&i,&data); s[i] = data; } #init end #module end #module ram65kx16 (WRbar,OEbar,CS,A[16],D[16]) #memory int thl,tlh,ttri; long tlasta, tlastd ; int tsetup; short s[65536]; #memory end #function (A) int i,k; tlasta = cur_delta; if ((VAL(CS) == HIGH) && (VAL(WRbar) == HIGH) && (VAL(OEbar) == LOW)) { for(i=0,k=0; i < 16 ; i++) k |= ((VAL(A[i]) == HIGH) << i); for(i=0; i < 16; i++) { if (s[k] & (1 << i)) NEW_VAL(D[i], tlh, HIGH); else NEW_VAL(D[i], thl,LOW); } } #function end #function (D) tlastd = cur_delta; #function end #function (CS) int i,k; if (VAL(CS) == HIGH) { if ((VAL(WRbar) == HIGH) && (VAL(OEbar) == LOW)) { for(i=0,k=0; i < 16 ; i++) k |= ((VAL(A[i]) == HIGH) << i); for(i=0; i < 16; i++) { if (s[k] & (1 << i)) NEW_VAL(D[i], tlh, HIGH); else NEW_VAL(D[i], thl,LOW); } } if (VAL(WRbar) == LOW) { if(cur_delta < (tlastd + tsetup)) lprintf(stdout,"data setup violation in %s at time %d\n", instance->name,cur_delta); if(cur_delta < (tlasta + tsetup)) lprintf(stdout,"address setup violation in %s at time %d\n", instance->name,cur_delta); for(i=0,k=0;i < 16 ;i++) k |= ((VAL(A[i]) == HIGH) << i); for(i=0,s[k]=0;i < 16;i++) s[k] |= ((VAL(D[i]) == HIGH)<name,cur_delta); if(cur_delta < (tlasta + tsetup)) lprintf(stdout,"address setup violation in %s at time %d\n", instance->name,cur_delta); for(i=0,k=0;i < 16;i++) k |= ((VAL(A[i]) == HIGH) << i); for(i=0,s[k]=0;i < 16;i++) s[k] |= ((VAL(D[i]) == HIGH) << i); if (VAL(OEbar) == LOW) { for(i=0; i < 16; i++) NEW_VAL(D[i], ttri, TRISTATE); } } } #function end #function (OEbar) int i,k; if ((VAL(CS) == HIGH) && (VAL(WRbar) == HIGH)) { if (VAL(OEbar) == LOW) { for(i=0,k=0;i < 16;i++) k |= ((VAL(A[i]) == HIGH) << i); for(i=0; i < 16; i++) { if (s[k] & (1 << i)) NEW_VAL(D[i], tlh, HIGH); else NEW_VAL(D[i], thl,LOW); } } else for(i=0; i < 16; i++) NEW_VAL(D[i], ttri, TRISTATE); } #function end #init begin long i; char line[256]; unsigned int data; FILE* prfile; thl = 500; tlh = 500; ttri = 500; tsetup = 300; tlasta = 0; tlastd = 0; for (i=0;i<65536;s[i++]=0); if ((ATTR("filename")) == NULL) lprintf(outfile,"No file for mem %s\n",instance->name); else if ((prfile = fopen(ATTR("filename"),"r")) == NULL) lprintf(outfile,"Could not open %s for mem %s\n", ATTR("filename"),instance->name); else while(fgets(line,256,prfile) != NULL) if (line[0] != ';') { sscanf(line,"%d%x",&i,&data); s[i] = data; } #init end #module end #module ram32kx16 (WRbar,OEbar,CS,A[15],D[16]) #memory int thl,tlh,ttri; long tlasta, tlastd ; int tsetup; short s[32768]; #memory end #function (A) int i,k; tlasta = cur_delta; if ((VAL(CS) == HIGH) && (VAL(WRbar) == HIGH) && (VAL(OEbar) == LOW)) { for(i=0,k=0; i < 15 ; i++) k |= ((VAL(A[i]) == HIGH) << i); for(i=0; i < 16; i++) { if (s[k] & (1 << i)) NEW_VAL(D[i], tlh, HIGH); else NEW_VAL(D[i], thl,LOW); } } #function end #function (D) tlastd = cur_delta; #function end #function (CS) int i,k; if (VAL(CS) == HIGH) { if ((VAL(WRbar) == HIGH) && (VAL(OEbar) == LOW)) { for(i=0,k=0; i < 15 ; i++) k |= ((VAL(A[i]) == HIGH) << i); for(i=0; i < 16; i++) { if (s[k] & (1 << i)) NEW_VAL(D[i], tlh, HIGH); else NEW_VAL(D[i], thl,LOW); } } if (VAL(WRbar) == LOW) { if(cur_delta < (tlastd + tsetup)) lprintf(stdout,"data setup violation in %s at time %d\n", instance->name,cur_delta); if(cur_delta < (tlasta + tsetup)) lprintf(stdout,"address setup violation in %s at time %d\n", instance->name,cur_delta); for(i=0,k=0;i < 15 ;i++) k |= ((VAL(A[i]) == HIGH) << i); for(i=0,s[k]=0;i < 16;i++) s[k] |= ((VAL(D[i]) == HIGH)<name,cur_delta); if(cur_delta < (tlasta + tsetup)) lprintf(stdout,"address setup violation in %s at time %d\n", instance->name,cur_delta); for(i=0,k=0;i < 15;i++) k |= ((VAL(A[i]) == HIGH) << i); for(i=0,s[k]=0;i < 16;i++) s[k] |= ((VAL(D[i]) == HIGH) << i); if (VAL(OEbar) == LOW) { for(i=0; i < 16; i++) NEW_VAL(D[i], ttri, TRISTATE); } } } #function end #function (OEbar) int i,k; if ((VAL(CS) == HIGH) && (VAL(WRbar) == HIGH)) { if (VAL(OEbar) == LOW) { for(i=0,k=0;i < 15;i++) k |= ((VAL(A[i]) == HIGH) << i); for(i=0; i < 16; i++) { if (s[k] & (1 << i)) NEW_VAL(D[i], tlh, HIGH); else NEW_VAL(D[i], thl,LOW); } } else for(i=0; i < 16; i++) NEW_VAL(D[i], ttri, TRISTATE); } #function end #init begin long i; char line[256]; unsigned int data; FILE* prfile; thl = 500; tlh = 500; ttri = 500; tsetup = 300; tlasta = 0; tlastd = 0; for (i=0;i<32768;s[i++]=0); if ((ATTR("filename")) == NULL) lprintf(outfile,"No file for mem %s\n",instance->name); else if ((prfile = fopen(ATTR("filename"),"r")) == NULL) lprintf(outfile,"Could not open %s for mem %s\n", ATTR("filename"),instance->name); else while(fgets(line,256,prfile) != NULL) if (line[0] != ';') { sscanf(line,"%d%x",&i,&data); s[i] = data; } #init end #module end #module iomodule (CS,A[2],D[16]) #memory int thl,tlh,ttri; long tlasta, tlastd,twrdelay,trddelay,tnextwr,tnextrd; int tsetup; FILE *filein; FILE *myoutfile; int s[4]; #memory end #function (A) int i,k; tlasta = cur_delta; if (VAL(CS) == HIGH) { k = ((VAL(A[1]) == HIGH) << 1) | (VAL(A[0]) == HIGH); for(i=0; i < 16; i++) { if (s[k] & (1 << i)) NEW_VAL(D[i], tlh, HIGH); else NEW_VAL(D[i], thl,LOW); } } #function end #function (D) tlastd = cur_delta; #function end #function (CS) int i,k; char c; if (VAL(CS) == HIGH) { if ( (cur_delta > tnextwr) && (s[3] == 0)) { tnextwr = cur_delta + twrdelay; c = s[2]; s[3] = 1; putc (c,myoutfile); } if ( (cur_delta > tnextrd) && (s[1] == 0)) { tnextrd = cur_delta + trddelay; c = getc (filein); s[0] = c; s[1] = 1; } k = ((VAL(A[1]) == HIGH) << 1) | (VAL(A[0]) == HIGH); if (k != 2) { for(i=0; i < 16; i++) { if (s[k] & (1 << i)) NEW_VAL(D[i], tlh, HIGH); else NEW_VAL(D[i], thl,LOW); } if (k == 0) s[1] = 0; } else { if(cur_delta < (tlastd + tsetup)) lprintf(stdout,"data setup violation in %s at time %d\n", instance->name,cur_delta); if(cur_delta < (tlasta + tsetup)) lprintf(stdout,"address setup violation in %s at time %d\n", instance->name,cur_delta); for(i=0,s[k]=0;i < 16;i++) s[k] |= ((VAL(D[i]) == HIGH)<