int main (int argc, char *argv[]) { phfig_list *pFig; phseg_list *pSeg; phvia_list *pVIA; long length[_MAX_ALU_]; long number[_MAX_ALU_]; long total_length; long total_number; long total_VIA; int i; mbkenv (); alliancebanner ( "PdV" , "0.1" , "Pot de Vin - Routing Evaluator" , "2002" , "5.0" ); if (argc < 2) { fprintf (stderr, "Usage : pdv <layout>\n"); exit (1); } pFig = getphfig (argv[1], 'A'); for (i = 0; i < _MAX_ALU_; i++) { length[i] = 0; number[i] = 0; } for (pSeg = pFig->PHSEG; pSeg != NULL; pSeg = pSeg->NEXT) { switch (pSeg->LAYER) { case ALU2: case CALU2: i = _ALU2_; break; case ALU3: case CALU3: i = _ALU3_; break; case ALU4: case CALU4: i = _ALU4_; break; case ALU5: case CALU5: i = _ALU5_; break; case ALU6: case CALU6: i = _ALU6_; break; case ALU7: case CALU7: i = _ALU7_; break; case ALU8: case CALU8: i = _ALU8_; break; default: continue; } number[i]++; if (pSeg->X1 == pSeg->X2) { /* Horizontal segments. */ length[i] += (pSeg->Y2 - pSeg->Y1) / SCALE_X; } else { /* Vertical segments. */ length[i] += (pSeg->X2 - pSeg->X1) / SCALE_X; } } for (i = 0; i < _MAX_ALU_; i++) { if (number[i] == 0) number[i]++; } total_VIA = 0; for (pVIA = pFig->PHVIA; pVIA != NULL; pVIA = pVIA->NEXT) { total_VIA++; } printf ("\n\n"); printf (" Routing statistics :\n\n"); total_length = 0; total_number = 0; for (i = 0; i < _MAX_ALU_; i++) { printf (" - ALU%d length := %10d", i+2, length[i]); printf (" (average length := %d)\n", length[i] / number[i]); total_length += length[i]; total_number += number[i]; } printf ("\n"); printf (" - Total length := %10d" , total_length); printf (" (average length := %d)\n", total_length / total_number); printf ("\n"); printf (" - Total VIA := %10d\n" , total_VIA); printf ("\n\n"); exit (0); }
CEnv::CEnv (void) { // Load the UNIX environmment for MBK. rdsenv (); loadrdsparam(); mbkenv (); // Copy constants values from constants namespace ("D::"). // Routing constants, loaded now that we have SCALE_X. D::X_GRID = ::MBK::SCALE (MBK_X_GRID); D::Y_GRID = ::MBK::SCALE (MBK_Y_GRID); D::WIDTH_VSS = ::MBK::SCALE (MBK_WIDTH_VSS); D::WIDTH_VDD = ::MBK::SCALE (MBK_WIDTH_VDD); D::Y_SLICE = ::MBK::SCALE (MBK_Y_SLICE); D::TRACK_WIDTH_ALU1 = ::MBK::SCALE (MBK_TRACK_WIDTH_ALU1); D::TRACK_WIDTH_ALU2 = ::MBK::SCALE (MBK_TRACK_WIDTH_ALU2); D::TRACK_WIDTH_ALU3 = ::MBK::SCALE (MBK_TRACK_WIDTH_ALU3); D::TRACK_WIDTH_ALU4 = ::MBK::SCALE (MBK_TRACK_WIDTH_ALU4); D::TRACK_WIDTH_ALU5 = ::MBK::SCALE (MBK_TRACK_WIDTH_ALU5); D::TRACK_WIDTH_ALU6 = ::MBK::SCALE (MBK_TRACK_WIDTH_ALU6); D::TRACK_WIDTH_ALU7 = ::MBK::SCALE (MBK_TRACK_WIDTH_ALU7); D::TRACK_WIDTH_ALU8 = ::MBK::SCALE (MBK_TRACK_WIDTH_ALU8); D::TRACK_SPACING_ALU1 = ::MBK::SCALE (MBK_TRACK_SPACING_ALU1); D::TRACK_SPACING_ALU2 = ::MBK::SCALE (MBK_TRACK_SPACING_ALU2); D::TRACK_SPACING_ALU3 = ::MBK::SCALE (MBK_TRACK_SPACING_ALU3); D::TRACK_SPACING_ALU4 = ::MBK::SCALE (MBK_TRACK_SPACING_ALU4); D::TRACK_SPACING_ALU5 = ::MBK::SCALE (MBK_TRACK_SPACING_ALU5); D::TRACK_SPACING_ALU6 = ::MBK::SCALE (MBK_TRACK_SPACING_ALU6); D::TRACK_SPACING_ALU7 = ::MBK::SCALE (MBK_TRACK_SPACING_ALU7); D::TRACK_SPACING_ALU8 = ::MBK::SCALE (MBK_TRACK_SPACING_ALU8); // Grid spacing. grid_dx = D::X_GRID; grid_dy = D::Y_GRID; // Layers minimal width. ALU2W[ALU1] = D::TRACK_WIDTH_ALU1; ALU2W[ALU2] = D::TRACK_WIDTH_ALU2; ALU2W[ALU3] = D::TRACK_WIDTH_ALU3; ALU2W[ALU4] = D::TRACK_WIDTH_ALU4; ALU2W[ALU5] = D::TRACK_WIDTH_ALU5; ALU2W[ALU6] = D::TRACK_WIDTH_ALU6; ALU2W[ALU7] = D::TRACK_WIDTH_ALU7; ALU2W[ALU8] = D::TRACK_WIDTH_ALU8; ALU2W[CALU1] = D::TRACK_WIDTH_ALU1; ALU2W[CALU2] = D::TRACK_WIDTH_ALU2; ALU2W[CALU3] = D::TRACK_WIDTH_ALU3; ALU2W[CALU4] = D::TRACK_WIDTH_ALU4; ALU2W[CALU5] = D::TRACK_WIDTH_ALU5; ALU2W[CALU6] = D::TRACK_WIDTH_ALU6; ALU2W[CALU7] = D::TRACK_WIDTH_ALU7; ALU2W[CALU8] = D::TRACK_WIDTH_ALU8; ALU2W[TALU1] = D::TRACK_WIDTH_ALU1; ALU2W[TALU2] = D::TRACK_WIDTH_ALU2; ALU2W[TALU3] = D::TRACK_WIDTH_ALU3; ALU2W[TALU4] = D::TRACK_WIDTH_ALU4; ALU2W[TALU5] = D::TRACK_WIDTH_ALU5; ALU2W[TALU6] = D::TRACK_WIDTH_ALU6; ALU2W[TALU7] = D::TRACK_WIDTH_ALU7; ALU2W[TALU8] = D::TRACK_WIDTH_ALU8; // Layers minimal width. ALU2S[ALU1] = D::TRACK_SPACING_ALU1; ALU2S[ALU2] = D::TRACK_SPACING_ALU2; ALU2S[ALU3] = D::TRACK_SPACING_ALU3; ALU2S[ALU4] = D::TRACK_SPACING_ALU4; ALU2S[ALU5] = D::TRACK_SPACING_ALU5; ALU2S[ALU6] = D::TRACK_SPACING_ALU6; ALU2S[ALU7] = D::TRACK_SPACING_ALU7; ALU2S[ALU8] = D::TRACK_SPACING_ALU8; ALU2S[CALU1] = D::TRACK_SPACING_ALU1; ALU2S[CALU2] = D::TRACK_SPACING_ALU2; ALU2S[CALU3] = D::TRACK_SPACING_ALU3; ALU2S[CALU4] = D::TRACK_SPACING_ALU4; ALU2S[CALU5] = D::TRACK_SPACING_ALU5; ALU2S[CALU6] = D::TRACK_SPACING_ALU6; ALU2S[CALU7] = D::TRACK_SPACING_ALU7; ALU2S[CALU8] = D::TRACK_SPACING_ALU8; ALU2S[TALU1] = D::TRACK_SPACING_ALU1; ALU2S[TALU2] = D::TRACK_SPACING_ALU2; ALU2S[TALU3] = D::TRACK_SPACING_ALU3; ALU2S[TALU4] = D::TRACK_SPACING_ALU4; ALU2S[TALU5] = D::TRACK_SPACING_ALU5; ALU2S[TALU6] = D::TRACK_SPACING_ALU6; ALU2S[TALU7] = D::TRACK_SPACING_ALU7; ALU2S[TALU8] = D::TRACK_SPACING_ALU8; // Layer to Z translation table. ALU2Z[ALU1] = 0; ALU2Z[ALU2] = 1; ALU2Z[ALU3] = 2; ALU2Z[ALU4] = 3; ALU2Z[ALU5] = 4; ALU2Z[ALU6] = 5; ALU2Z[ALU7] = 6; ALU2Z[ALU8] = 7; ALU2Z[CALU1] = 0; ALU2Z[CALU2] = 1; ALU2Z[CALU3] = 2; ALU2Z[CALU4] = 3; ALU2Z[CALU5] = 4; ALU2Z[CALU6] = 5; ALU2Z[CALU7] = 6; ALU2Z[CALU8] = 7; ALU2Z[TALU1] = 0; ALU2Z[TALU2] = 1; ALU2Z[TALU3] = 2; ALU2Z[TALU4] = 3; ALU2Z[TALU5] = 4; ALU2Z[TALU6] = 5; ALU2Z[TALU7] = 6; ALU2Z[TALU8] = 7; regcomp(&pxLibRegex,"p.*px",REG_EXTENDED|REG_NOSUB); }
int main(int argc, char **argv) { lofig_list *f; char *filein=NULL, *fileout=NULL; int i,j; int opt=0; if (argc<2) { printusage(); exit(1); } mbkenv(); for (i=1; i<argc; i++) if (argv[i][0]=='-') for (j=1; argv[i][j]!='\0'; j++) { switch (argv[i][j]) { case 'a': opt|=ADDSIG; break; case 'n': opt|=NOALIM; break; case 'g': opt|=NOLOGEN; break; case 'r': opt|=RENINS; break; case 'v': opt|=VSTDRV; break; case 'c': opt|=VECCON; break; case 'm': opt|=MBKDRV; break; case 'u': opt|=NOVECT; break; default: fprintf(stderr, "** Unknown option -%c\n", argv[i][1]); printusage(); exit(2); } } else if (!filein) filein=argv[i]; else if (!fileout) fileout=argv[i]; else { fputs("** Too many filenames\n", stderr); printusage(); exit(4); } if (!filein) { fputs("** Filename expected!\n", stderr); printusage(); exit(3); } f=getlofig(filein,'A'); guessextdir(f); if (opt & NOALIM) removepowers(f); if (opt & RENINS) renameinstance(f); if (opt & NOLOGEN) removelogen(f); #if 0 if (opt & VECCON) { vectlocon(f); sortlocon(&f->LOCON); f->LOCON=(locon_list *)reverse(f->LOCON); } #endif if (fileout) f->NAME=namealloc(fileout); if (!(opt & NOVECT)) vectlosig(&f->LOSIG); if (opt & MBKDRV) savelofig(f); else { if (opt&VSTDRV) vhdlsavevelofig(f, 0); else if (opt&ADDSIG) vhdlsavevelofig(f, 1); else vhdlsavevelofig(f, 2); } #if 0 #ifdef VEL_DEBUG f->NAME=namealloc("netlist"); vhdlsavevelofig(f,1); #endif #endif exit(0); }