00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include<stdlib.h>
00025 #include<string.h>
00026 #include<stdio.h>
00027 #include "globals.h"
00028 #include "read_blif.h"
00029 #include "util.h"
00030 #include "string_cache.h"
00031 #include "netlist_utils.h"
00032 #include "errors.h"
00033 #include "netlist_utils.h"
00034 #include "types.h"
00035
00036
00037
00038 #define TOKENS " \t\n"
00039
00040
00041 static FILE * blif;
00042 int linenum;
00043
00044 STRING_CACHE *output_nets_sc;
00045 STRING_CACHE *input_nets_sc;
00046
00047 const char *GND ="gnd";
00048 const char *VCC="vcc";
00049 const char *HBPAD="unconn";
00050
00051 char *blif_one_string = "ONE_VCC_CNS";
00052 char *blif_zero_string = "ZERO_GND_ZERO";
00053 char *blif_pad_string = "ZERO_PAD_ZERO";
00054 char *default_clock_name="top^clock";
00055
00056 netlist_t * blif_netlist;
00057 int linenum;
00058 short static skip_reading_bit_map=FALSE;
00059
00060 void create_top_driver_nets( char *instance_name_prefix);
00061 void look_for_clocks();
00062 void add_top_input_nodes();
00063 void create_top_output_nodes();
00064 static void read_tokens (char *buffer,int * done,char * blif_file);
00065 static void dum_parse ( char *buffer);
00066 void create_internal_node_and_driver();
00067 short assign_node_type_from_node_name(char * output_name);
00068 short read_bit_map_find_unknown_gate(int input_count,nnode_t * node);
00069 void create_latch_node_and_driver(char * blif_file);
00070 void create_hard_block_nodes();
00071 void hook_up_nets();
00072 char* search_clock_name(char * blif_file);
00073
00074 void read_blif(char * blif_file)
00075 {
00076
00077 int done;
00078 char buffer[BUFSIZE];
00079
00080
00081 output_nets_sc = sc_new_string_cache();
00082 input_nets_sc = sc_new_string_cache();
00083
00084 blif_netlist = allocate_netlist();
00085
00086 blif = my_fopen (blif_file, "r", 0);
00087
00088
00089 #ifdef debug_mode
00090 printf("reading top level module");
00091 #endif
00092
00093
00094 create_top_driver_nets("top");
00095
00096
00097
00098 linenum = 0;
00099 done = 0;
00100 while (!done && (my_fgets(buffer, BUFSIZE, blif) != NULL) )
00101 {
00102 read_tokens(buffer,&done,blif_file);
00103 }
00104
00105 fclose (blif);
00106
00107 #ifdef debug_mode
00108 printf("\nreading look_for_clock\n");
00109 #endif
00110
00111
00112 look_for_clocks();
00113
00114 }
00115
00116
00117
00118
00119
00120
00121
00122 static void read_tokens (char *buffer,int * done,char * blif_file)
00123 {
00124
00125
00126
00127 char *ptr;
00128
00129 ptr = my_strtok (buffer, TOKENS, blif, buffer);
00130
00131 #ifdef debug_mode
00132 printf("\nreading the read_tokens : %s",ptr);
00133 #endif
00134
00135 if (ptr == NULL)
00136 return;
00137
00138
00139 if((skip_reading_bit_map==TRUE) &&((ptr == NULL) && ((ptr[0] == '0') || (ptr[0] == '1') || (ptr[0] == '-'))))
00140 {
00141 dum_parse(buffer);
00142 return ;
00143 }
00144
00145 skip_reading_bit_map= FALSE;
00146 if (strcmp (ptr, ".inputs") == 0)
00147 {
00148
00149 add_top_input_nodes();
00150 return;
00151 }
00152
00153 if (strcmp (ptr, ".outputs") == 0)
00154 {
00155
00156 create_top_output_nodes();
00157 return;
00158 }
00159
00160 if (strcmp (ptr, ".names") == 0)
00161 {
00162
00163 create_internal_node_and_driver();
00164 return;
00165 }
00166
00167 if(strcmp(ptr,".latch") == 0)
00168 {
00169
00170 create_latch_node_and_driver(blif_file);
00171 return;
00172 }
00173
00174 if(strcmp(ptr,".subckt") == 0)
00175 {
00176 #ifdef debug_mode
00177 printf("\n reading the subckt module \n");
00178 #endif
00179
00180 create_hard_block_nodes();
00181 return;
00182 }
00183
00184 if(strcmp(ptr,".end")==0)
00185 {
00186
00187
00188 hook_up_nets();
00189 *done=1;
00190 return;
00191 }
00192
00193 if(strcmp(ptr,".model")==0)
00194 {
00195
00196 dum_parse(buffer);
00197 return;
00198 }
00199
00200 }
00201
00202
00203
00204
00205
00206
00207
00208 short assign_node_type_from_node_name(char * output_name)
00209 {
00210
00211 #ifdef debug_mode
00212 printf("\n reading assign_node_type_from_node_name");
00213 printf("\n output_name : %s",output_name);
00214 #endif
00215
00216 int length_string;
00217 int start,end,i;
00218 int j=0;
00219 char *extracted_string;
00220 length_string=strlen(output_name);
00221
00222 for(start=length_string-1;(start >=0) && (output_name[start]!='^');start--);
00223 for(end=length_string-1;(end>=0) && (output_name[end]!='~');end--);
00224
00225
00226
00227 #ifdef debug_mode
00228 printf("\n Start= %d end=%d \n",start,end);
00229 #endif
00230
00231 if((start>=end) || (end==0))
00232 return GENERIC;
00233
00234 extracted_string=(char*)malloc(sizeof(char)*((end-start+2)));
00235 for(i=start+1;i<end;i++)
00236 {
00237 extracted_string[j]=output_name[i];
00238 j++;
00239 }
00240 extracted_string[j]='\0';
00241
00242 #ifdef debug_mode
00243 printf("Extracted string: %s \n",extracted_string);
00244 #endif
00245
00246
00247
00248 if(strcmp(extracted_string,"GT")==0)
00249 return GT;
00250 else if(strcmp(extracted_string,"LT")==0)
00251 return LT;
00252 else if(strcmp(extracted_string,"ADDER_FUNC")==0)
00253 return ADDER_FUNC;
00254 else if(strcmp(extracted_string,"CARRY_FUNC")==0)
00255 return CARRY_FUNC;
00256 else if(strcmp(extracted_string,"BITWISE_NOT")==0)
00257 return BITWISE_NOT;
00258 else if(strcmp(extracted_string,"LOGICAL_AND")==0)
00259 return LOGICAL_AND;
00260 else if(strcmp(extracted_string,"LOGICAL_OR")==0)
00261 return LOGICAL_OR;
00262 else if(strcmp(extracted_string,"LOGICAL_XOR")==0)
00263 return LOGICAL_XOR;
00264 else if(strcmp(extracted_string,"LOGICAL_XNOR")==0)
00265 return LOGICAL_XNOR;
00266 else if(strcmp(extracted_string,"LOGICAL_NAND")==0)
00267 return LOGICAL_NAND;
00268 else if(strcmp(extracted_string,"LOGICAL_NOR")==0)
00269 return LOGICAL_NOR;
00270 else if(strcmp(extracted_string,"LOGICAL_EQUAL")==0)
00271 return LOGICAL_EQUAL;
00272 else if(strcmp(extracted_string,"NOT_EQUAL")==0)
00273 return NOT_EQUAL;
00274 else if(strcmp(extracted_string,"LOGICAL_NOT")==0)
00275 return LOGICAL_NOT;
00276 else if(strcmp(extracted_string,"MUX_2")==0)
00277 return MUX_2;
00278 else if(strcmp(extracted_string,"FF_NODE")==0)
00279 return FF_NODE;
00280 else if(strcmp(extracted_string,"MULTIPLY")==0)
00281 return MULTIPLY;
00282 else if(strcmp(extracted_string,"HARD_IP")==0)
00283 return HARD_IP;
00284 else if(strcmp(extracted_string,"INPUT_NODE")==0)
00285 return INPUT_NODE;
00286 else if(strcmp(extracted_string,"OUTPUT_NODE")==0)
00287 return OUTPUT_NODE;
00288 else if(strcmp(extracted_string,"PAD_NODE")==0)
00289 return PAD_NODE;
00290 else if(strcmp(extracted_string,"CLOCK_NODE")==0)
00291 return CLOCK_NODE;
00292 else if(strcmp(extracted_string,"GND_NODE")==0)
00293 return GND_NODE;
00294 else if(strcmp(extracted_string,"VCC_NODE")==0)
00295 return VCC_NODE;
00296 else if(strcmp(extracted_string,"BITWISE_AND")==0)
00297 return BITWISE_AND;
00298 else if(strcmp(extracted_string,"BITWISE_NAND")==0)
00299 return BITWISE_NAND;
00300 else if(strcmp(extracted_string,"BITWISE_NOR")==0)
00301 return BITWISE_NOR;
00302 else if(strcmp(extracted_string,"BITWISE_XNOR")==0)
00303 return BITWISE_XNOR;
00304 else if(strcmp(extracted_string,"BITWISE_XOR")==0)
00305 return BITWISE_XOR;
00306 else if(strcmp(extracted_string,"BITWISE_OR")==0)
00307 return BITWISE_OR;
00308 else if(strcmp(extracted_string,"BUF_NODE")==0)
00309 return BUF_NODE;
00310 else if(strcmp(extracted_string,"MULTI_PORT_MUX")==0)
00311 return MULTI_PORT_MUX;
00312 else if(strcmp(extracted_string,"SL")==0)
00313 return SL;
00314 else if(strcmp(extracted_string,"SR")==0)
00315 return SR;
00316 else if(strcmp(extracted_string,"CASE_EQUAL")==0)
00317 return CASE_EQUAL;
00318 else if(strcmp(extracted_string,"CASE_NOT_EQUAL")==0)
00319 return CASE_NOT_EQUAL;
00320 else if(strcmp(extracted_string,"DIVIDE")==0)
00321 return DIVIDE;
00322 else if(strcmp(extracted_string,"MODULO")==0)
00323 return MODULO;
00324 else if(strcmp(extracted_string,"GTE")==0)
00325 return GTE;
00326 else if(strcmp(extracted_string,"LTE")==0)
00327 return LTE;
00328 else if(strcmp(extracted_string,"ADD")==0)
00329 return ADD;
00330 else if(strcmp(extracted_string,"MINUS")==0)
00331 return MINUS;
00332 else return GENERIC;
00333
00334
00335 }
00336
00337
00338
00339
00340
00341
00342 void create_latch_node_and_driver(char * blif_file)
00343 {
00344
00345 #ifdef debug_mode
00346 printf("\n Reading the create_latch_node and driver ");
00347 #endif
00348
00349 long sc_spot;
00350 nnode_t *new_node = allocate_nnode();
00351 npin_t *new_pin;
00352 nnet_t *new_net;
00353 char buffer[BUFSIZE];
00354 char *ptr;
00355 int input_token_count=0;
00356
00357 int i;
00358 char ** names=NULL;
00359 char *clock_name;
00360
00361
00362 while ((ptr= my_strtok (NULL, TOKENS, blif, buffer)) != NULL)
00363 {
00364 #ifdef debug_mode
00365 printf("\n\t ptr=%s",ptr);
00366 #endif
00367 input_token_count++;
00368 names= (char**)realloc(names, sizeof(char*)* input_token_count);
00369 names[input_token_count-1]=(char*)malloc(sizeof(char)*(strlen(ptr)+1));
00370 sprintf(names[input_token_count-1],"%s",ptr);
00371 }
00372
00373
00374
00375
00376 #ifdef debug_mode
00377 printf("\n\tinput_token_count=%d\n",input_token_count);
00378 #endif
00379
00380 if(input_token_count!=5)
00381 {
00382
00383 if(input_token_count==3)
00384 {
00385 clock_name=search_clock_name(blif_file);
00386 input_token_count=5;
00387 names= (char**)realloc(names, sizeof(char*)* input_token_count);
00388 if(clock_name!=NULL)
00389 {
00390 names[3]=(char*)malloc(sizeof(char)*(strlen(clock_name)+1));
00391 sprintf(names[3],"%s",clock_name);
00392 }
00393 else
00394 names[3]=NULL;
00395
00396 names[4]=(char*)malloc(sizeof(char)*(1+1));
00397 sprintf(names[4],"%s",names[2]);
00398 sprintf(names[2],"re");
00399
00400 }
00401
00402 else
00403 {
00404 printf("This .latch Format not supported \n\t required format :.latch <input> <output> [<type> <control/clock>] <initial val>");
00405 exit(-1);
00406 }
00407 }
00408
00409 new_node->related_ast_node = NULL;
00410 new_node->type=FF_NODE;
00411
00412
00413 allocate_more_node_output_pins(new_node, 1);
00414 add_output_port_information(new_node, 1);
00415
00416
00417 allocate_more_node_input_pins(new_node,2);
00418
00419
00420 for(i=0;i<2;i++)
00421 {
00422 add_input_port_information(new_node,1);
00423 }
00424
00425
00426 new_pin=allocate_npin();
00427 new_pin->name=names[0];
00428 new_pin->type=INPUT;
00429 add_a_input_pin_to_node_spot_idx(new_node, new_pin,0);
00430
00431 new_pin=allocate_npin();
00432 new_pin->name=names[3];
00433 new_pin->type=INPUT;
00434 add_a_input_pin_to_node_spot_idx(new_node, new_pin,1);
00435
00436
00437
00438 new_node->name = make_full_ref_name(names[1],NULL, NULL, NULL,-1);
00439
00440
00441
00442 blif_netlist->ff_nodes = (nnode_t**)realloc(blif_netlist->ff_nodes, sizeof(nnode_t*)*(blif_netlist->num_ff_nodes+1));
00443 blif_netlist->ff_nodes[blif_netlist->num_ff_nodes] =new_node;
00444 blif_netlist->num_ff_nodes++;
00445
00446
00447 new_pin=allocate_npin();
00448 new_net=allocate_nnet();
00449 new_net->name=new_node->name;
00450 new_pin->name=new_node->name;
00451 new_pin->type=OUTPUT;
00452 add_a_output_pin_to_node_spot_idx(new_node, new_pin, 0);
00453 add_a_driver_pin_to_net(new_net,new_pin);
00454
00455
00456 sc_spot = sc_add_string(output_nets_sc,new_node->name);
00457
00458
00459 if (output_nets_sc->data[sc_spot] != NULL)
00460 {
00461 error_message(NETLIST_ERROR,linenum,-1, "Net (%s) with the same name already created\n",ptr);
00462 }
00463
00464
00465 output_nets_sc->data[sc_spot] = (void*)new_net;
00466
00467
00468 free(names);
00469
00470 #ifdef debug_mode
00471 printf("\n exiting the create_latch_node and driver ");
00472 #endif
00473
00474 }
00475
00476
00477
00478
00479
00480
00481 char* search_clock_name(char * blif_file)
00482 {
00483 FILE * temp_read_blif;
00484 int found=0;
00485 char *ptr;
00486 char buffer[BUFSIZE];
00487 char ** input_names=NULL;
00488 int input_names_count=0;
00489 int i=0;
00490 temp_read_blif=fopen(blif_file,"r");
00491
00492 #ifdef debug_mode
00493 printf("Control for the .latch not mentioned, searching for the clock\n");
00494 #endif
00495
00496 while(1)
00497 {
00498 if(found==1)
00499 break;
00500
00501 my_fgets(buffer,BUFSIZE,temp_read_blif);
00502 #ifdef debug_mode
00503 printf(" buffer : %s \n",buffer);
00504 #endif
00505
00506 if(feof(temp_read_blif)!=0)
00507 break;
00508
00509 ptr= my_strtok(buffer,TOKENS,temp_read_blif,buffer);
00510 #ifdef debug_mode
00511 printf(" ptr : %s \n",ptr);
00512 #endif
00513
00514 if(ptr==NULL)
00515 continue;
00516
00517 if(strcmp(ptr,".end")==0)
00518 break;
00519
00520
00521
00522 if(strcmp(ptr,".inputs")==0)
00523 {
00524
00525 while(1)
00526 {
00527 ptr=my_strtok (NULL, TOKENS,temp_read_blif, buffer);
00528
00529 #ifdef debug_mode
00530 printf(" ptr : %s \n",ptr);
00531 #endif
00532 if(ptr==NULL)
00533 break;
00534 if(strcmp(ptr,"top^reset_n")!=0)
00535 {
00536 input_names_count++;
00537 input_names=(char**)realloc(input_names,sizeof(char*) * input_names_count);
00538 input_names[input_names_count-1]=(char*)malloc(sizeof(char)*(strlen(ptr)+1));
00539 sprintf(input_names[input_names_count-1],"%s",ptr);
00540 }
00541
00542 }
00543
00544 continue;
00545 }
00546
00547 if(strcmp(ptr,".names")==0 || strcmp(ptr,".latch")==0)
00548 {
00549 while(1)
00550 {
00551
00552 #ifdef debug_mode
00553 printf(" ptr : %s \n",ptr);
00554 #endif
00555 ptr=my_strtok (NULL, TOKENS,temp_read_blif, buffer);
00556
00557 if(ptr==NULL)
00558 break;
00559
00560 for(i=0;i<input_names_count;i++)
00561 {
00562 if(strcmp(ptr,input_names[i])==0)
00563 {
00564 free(input_names[i]);
00565 input_names[i]=input_names[input_names_count-1];
00566 input_names_count--;
00567 }
00568 }
00569 }
00570 continue;
00571 }
00572
00573 if(input_names_count==1)
00574 {
00575 found=1;
00576 break;
00577 }
00578
00579 }
00580 fclose(temp_read_blif);
00581
00582
00583 if(found==1)
00584 {
00585 #ifdef debug_mode
00586 printf("Clock name found: %s\n",input_names[0]);
00587 #endif
00588 return input_names[0];
00589 }
00590 else
00591 {
00592 return default_clock_name;
00593 }
00594
00595 }
00596
00597
00598
00599
00600
00601
00602
00603 void create_hard_block_nodes()
00604 {
00605 FILE *temp_search;
00606 char buffer[BUFSIZE];
00607 char *name_subckt;
00608 char *temp1,*temp2;
00609 char **names_formal=NULL;
00610 char **names_actual=NULL;
00611 char **names_parameters=NULL;
00612 int count=0;
00613 char *ptr;
00614 int done=0;
00615 int input_count=0;
00616 long sc_spot;
00617 nnode_t *new_node = allocate_nnode();
00618 npin_t *new_pin;
00619 nnet_t *new_net;
00620 int input_port_count=0;
00621 int output_port_count=0;
00622 int i=0;
00623 fpos_t pos;
00624
00625
00626 ptr= my_strtok (NULL, TOKENS, blif, buffer);
00627 name_subckt=(char*)malloc(sizeof(char)*(strlen(ptr)+1));
00628 sprintf(name_subckt,"%s",ptr);
00629
00630 #ifdef debug_mode
00631 printf("\nname_subckt: %s",name_subckt);
00632 #endif
00633
00634
00635 while ((ptr= my_strtok (NULL, TOKENS, blif, buffer)) != NULL)
00636 {
00637
00638 #ifdef debug_mode
00639 printf("\n ptr: %s",ptr);
00640 #endif
00641
00642 count++;
00643 names_parameters= (char**)realloc(names_parameters, sizeof(char*)*count);
00644 names_parameters[count-1]=(char*)malloc(sizeof(char)*(strlen(ptr)+1));
00645 sprintf(names_parameters[count-1],"%s",ptr);
00646 }
00647
00648 names_actual=(char**)malloc(sizeof(char*)*count);
00649 names_formal=(char**)malloc(sizeof(char*)*count);
00650
00651 while(i<count)
00652 {
00653 ptr=strtok(names_parameters[i],"=");
00654 #ifdef debug_mode
00655 printf("\n ptr: %s",ptr);
00656 #endif
00657
00658 names_actual[i]=(char*)malloc(sizeof(char)*(strlen(ptr)+1));
00659 sprintf(names_actual[i],"%s",ptr);
00660 ptr=strtok(NULL,"=");
00661 names_formal[i]=(char*)malloc(sizeof(char)*(strlen(ptr)+1));
00662 sprintf(names_formal[i],"%s",ptr);
00663 i++;
00664 }
00665
00666 for(i=0;i<count;i++)
00667 {
00668 free(names_parameters[i]);
00669
00670 #ifdef debug_mode
00671 printf("\n %s \t%s",names_actual[i],names_formal[i]);
00672 #endif
00673
00674 }
00675 free(names_parameters);
00676
00677 fgetpos(blif,&pos);
00678 temp_search=blif;
00679
00680 while (1)
00681 {
00682 my_fgets(buffer, BUFSIZE,temp_search);
00683 if(feof(temp_search)!=0)
00684 {
00685 printf("Error : The '%s' subckt no found ",name_subckt);
00686 exit(-1);
00687 }
00688 ptr=my_strtok(buffer,TOKENS, temp_search, buffer);
00689 #ifdef debug_mode
00690 printf("\n ptr : %s",ptr);
00691 #endif
00692 if (ptr==NULL)
00693 continue;
00694 if(strcmp(ptr,".model")!=0)
00695 continue;
00696
00697 ptr=my_strtok(NULL,TOKENS, temp_search, buffer);
00698 if(strcmp(ptr,name_subckt)==0)
00699 break;
00700
00701 }
00702
00703
00704
00705
00706
00707 while (!done && (my_fgets (buffer, BUFSIZE,temp_search) != NULL) )
00708 {
00709 ptr = my_strtok (buffer, TOKENS, temp_search, buffer);
00710
00711 #ifdef debug_mode
00712 printf("\n ptr: %s",ptr);
00713 #endif
00714
00715 if(strcmp(ptr,".inputs")==0)
00716 {
00717 while ((ptr= my_strtok (NULL, TOKENS,temp_search, buffer)) != NULL)
00718 input_count++;
00719 done=1;
00720 }
00721 }
00722
00723 #ifdef debug_mode
00724 printf("\n input_count %d",input_count);
00725 printf("\n count %d",count);
00726 #endif
00727
00728
00729 if(input_count>0)
00730 {
00731 input_port_count=1;
00732
00733 for(i=0;i<input_count-1;i++)
00734 {
00735 ptr=strtok(names_actual[i+1],"~");
00736 temp2=ptr;
00737 ptr=strtok(names_actual[i],"~");
00738 temp1=ptr;
00739
00740 #ifdef debug_mode
00741 printf("\n %s \t %s",temp1,temp2);
00742 #endif
00743
00744 if(strcmp(temp1,temp2)!=0)
00745 {
00746 add_input_port_information(new_node,input_port_count);
00747 input_port_count=1;
00748 }
00749 else
00750 input_port_count++;
00751 }
00752 add_input_port_information(new_node,input_port_count);
00753 }
00754
00755 if(count-input_count>0)
00756 {
00757 output_port_count=1;
00758
00759 for(i=input_count;i<count-input_count-1;i++)
00760 {
00761 ptr=strtok(names_actual[i+1],"~");
00762 temp2=ptr;
00763 ptr=strtok(names_actual[i],"~");
00764 temp1=ptr;
00765
00766 #ifdef debug_mode
00767 printf("\n %s \t %s",temp1,temp2);
00768 #endif
00769
00770 if(strcmp(temp1,temp2)!=0)
00771 {
00772 add_output_port_information(new_node,output_port_count);
00773 output_port_count=1;
00774 }
00775 else
00776 output_port_count++;
00777 }
00778 add_output_port_information(new_node,output_port_count);
00779 }
00780
00781
00782
00783 if(strcmp(name_subckt,"multiply")==0)
00784 new_node->type=MULTIPLY;
00785 else
00786 new_node->type=MEMORY;
00787
00788
00789 allocate_more_node_output_pins(new_node,count-input_count);
00790
00791
00792 if (input_count > 0)
00793 {
00794 allocate_more_node_input_pins(new_node, input_count);
00795 }
00796
00797
00798 for(i=0;i<input_count;i++)
00799 {
00800 new_node->input_pins[i]=allocate_npin();
00801 new_node->input_pins[i]->name=names_formal[i];
00802 new_node->input_pins[i]->type=INPUT;
00803 ptr=strtok(names_actual[i],"~");
00804 new_node->input_pins[i]->mapping=(char*)malloc(sizeof(char)*(strlen(ptr)+1));
00805 sprintf(new_node->input_pins[i]->mapping,"%s",ptr);
00806 }
00807
00808
00809 new_node->related_ast_node=(ast_node_t *)calloc(1, sizeof(ast_node_t));
00810 new_node->related_ast_node->children=(ast_node_t **)calloc(1,sizeof(ast_node_t *));
00811 new_node->related_ast_node->children[0]=(ast_node_t *)calloc(1, sizeof(ast_node_t));
00812 new_node->related_ast_node->children[0]->types.identifier=(char*)calloc(1,sizeof(char)*(strlen(name_subckt)+1));
00813 sprintf(new_node->related_ast_node->children[0]->types.identifier,"%s",name_subckt);
00814
00815
00816 new_node->name = make_full_ref_name(name_subckt,NULL, NULL, NULL,-1);
00817
00818
00819 blif_netlist->internal_nodes = (nnode_t**)realloc(blif_netlist->internal_nodes, sizeof(nnode_t*)*(blif_netlist->num_internal_nodes+1));
00820 blif_netlist->internal_nodes[blif_netlist->num_internal_nodes] =new_node;
00821 blif_netlist->num_internal_nodes++;
00822
00823
00824 for(i=0;i<count-input_count;i++)
00825 {
00826
00827 new_pin=allocate_npin();
00828 new_net=allocate_nnet();
00829 new_net->name=names_formal[i+input_count];
00830 new_pin->name=names_formal[i+input_count];
00831 new_pin->type=OUTPUT;
00832 ptr=strtok(names_actual[i+input_count],"~");
00833
00834 #ifdef debug_mode
00835 printf("\n ptr %s\n",ptr);
00836 #endif
00837
00838 add_a_output_pin_to_node_spot_idx(new_node, new_pin,i);
00839 new_node->output_pins[i]->mapping=(char*)malloc(sizeof(char)*(strlen(ptr)+1));
00840 sprintf(new_node->output_pins[i]->mapping,"%s",ptr);
00841 add_a_output_pin_to_node_spot_idx(new_node, new_pin,i);
00842 add_a_driver_pin_to_net(new_net,new_pin);
00843
00844
00845 sc_spot = sc_add_string(output_nets_sc,names_formal[i+input_count]);
00846 if (output_nets_sc->data[sc_spot] != NULL)
00847 {
00848 error_message(NETLIST_ERROR,linenum, -1,"Net (%s) with the same name already created\n",ptr);
00849 }
00850
00851 output_nets_sc->data[sc_spot] = (void*)new_net;
00852 }
00853
00854
00855 free(names_formal);
00856 free(names_actual);
00857 free(names_parameters);
00858 fsetpos(blif,&pos);
00859
00860 #ifdef debug_mode
00861 printf("\n exiting the create_hard_block module");
00862 #endif
00863
00864 }
00865
00866
00867
00868
00869
00870
00871 void create_internal_node_and_driver()
00872 {
00873
00874 #ifdef debug_mode
00875 printf("\n reading create_internal_node_driver");
00876 #endif
00877
00878 long sc_spot;
00879 nnode_t *new_node = allocate_nnode();
00880 npin_t *new_pin;
00881 nnet_t *new_net;
00882 short node_type;
00883 char buffer[BUFSIZE];
00884 char *ptr;
00885 char ** names=NULL;
00886 int input_count=0;
00887 int i;
00888
00889
00890 while ((ptr= my_strtok (NULL, TOKENS, blif, buffer)) != NULL)
00891 {
00892 input_count++;
00893 names= (char**)realloc(names, sizeof(char*)* input_count);
00894 names[input_count-1]=(char*)malloc(sizeof(char)*(strlen(ptr)+1));
00895 sprintf(names[input_count-1],"%s",ptr);
00896 }
00897
00898
00899 new_node->related_ast_node = NULL;
00900
00901 if( (strcmp(names[input_count-1],"gnd")==0) || (strcmp(names[input_count-1],"vcc")==0) || (strcmp(names[input_count-1],"unconn")==0))
00902 {
00903 skip_reading_bit_map=TRUE;
00904 return;
00905 }
00906
00907 #ifdef debug_mode
00908 printf("\nnames %s",names[input_count-1]);
00909 #endif
00910
00911
00912
00913 node_type=assign_node_type_from_node_name(names[input_count-1]);
00914
00915 #ifdef debug_mode
00916 printf("\n exiting assign_node_type_from_node_name\n");
00917 printf("\n node_type= %d\n",node_type);
00918 #endif
00919
00920 if(node_type!=GENERIC)
00921 {
00922 new_node->type=node_type;
00923 skip_reading_bit_map=TRUE;
00924 }
00925
00926 else if(node_type == GENERIC)
00927 {
00928 new_node->type=read_bit_map_find_unknown_gate(input_count-1,new_node);
00929 skip_reading_bit_map=TRUE;
00930
00931 #ifdef debug_mode
00932 printf("\n exiting read_bit_map_find_unknown_gate \n");
00933 printf("\n node_type= %d\n",new_node->type);
00934 #endif
00935
00936 }
00937
00938
00939 if (input_count-1 > 0)
00940 {
00941 allocate_more_node_input_pins(new_node, input_count-1);
00942
00943
00944 if(new_node->type==MUX_2)
00945 {
00946 add_input_port_information(new_node, (input_count-1)/2);
00947 add_input_port_information(new_node, (input_count-1)/2);
00948 }
00949 else
00950 {
00951 for(i=0;i<input_count-1;i++)
00952 {
00953 add_input_port_information(new_node, 1);
00954 }
00955 }
00956 }
00957
00958 for(i=0;i<=input_count-2;i++)
00959 {
00960 new_pin=allocate_npin();
00961 new_pin->name=names[i];
00962 new_pin->type=INPUT;
00963 add_a_input_pin_to_node_spot_idx(new_node, new_pin, i);
00964 }
00965
00966
00967 if(new_node->type==GND_NODE)
00968 {
00969 allocate_more_node_input_pins(new_node,1);
00970 add_input_port_information(new_node, 1);
00971 new_pin=allocate_npin();
00972 new_pin->name=(char *)GND;
00973 new_pin->type=INPUT;
00974 add_a_input_pin_to_node_spot_idx(new_node, new_pin,0);
00975 }
00976
00977 if(new_node->type==VCC_NODE)
00978 {
00979 allocate_more_node_input_pins(new_node,1);
00980 add_input_port_information(new_node, 1);
00981 new_pin=allocate_npin();
00982 new_pin->name=(char *)VCC;
00983 new_pin->type=INPUT;
00984 add_a_input_pin_to_node_spot_idx(new_node, new_pin,0);
00985 }
00986
00987
00988
00989 allocate_more_node_output_pins(new_node, 1);
00990 add_output_port_information(new_node, 1);
00991
00992
00993 new_node->name = make_full_ref_name(names[input_count-1],NULL, NULL, NULL,-1);
00994
00995
00996 blif_netlist->internal_nodes = (nnode_t**)realloc(blif_netlist->internal_nodes, sizeof(nnode_t*)*(blif_netlist->num_internal_nodes+1));
00997 blif_netlist->internal_nodes[blif_netlist->num_internal_nodes] =new_node;
00998 blif_netlist->num_internal_nodes++;
00999
01000
01001
01002 new_pin=allocate_npin();
01003 new_net=allocate_nnet();
01004 new_net->name=new_node->name;
01005 new_pin->name=new_node->name;
01006 new_pin->type=OUTPUT;
01007 add_a_output_pin_to_node_spot_idx(new_node, new_pin, 0);
01008 add_a_driver_pin_to_net(new_net,new_pin);
01009
01010
01011 sc_spot = sc_add_string(output_nets_sc,new_node->name );
01012 if (output_nets_sc->data[sc_spot] != NULL)
01013 {
01014 error_message(NETLIST_ERROR,linenum,-1, "Net (%s) with the same name already created\n",ptr);
01015 }
01016
01017
01018 output_nets_sc->data[sc_spot] = (void*)new_net;
01019
01020
01021 free(names);
01022
01023 #ifdef debug_mode
01024 printf("\n exiting create_internal_node_driver");
01025 #endif
01026
01027 }
01028
01029
01030
01031
01032
01033
01034
01035 short read_bit_map_find_unknown_gate(int input_count,nnode_t * node)
01036 {
01037
01038 #ifdef debug_mode
01039 printf(" Reading the read_bit_map_find_unknown_gate \n");
01040 #endif
01041
01042 FILE * temp_fpointer;
01043 char buffer[BUFSIZE];
01044 fpos_t pos;
01045 char *ptr;
01046 int i,j;
01047 int line_count_bitmap=0;
01048 char ** bit_map=NULL;
01049 char output_bit_map[10];
01050
01051 fgetpos(blif,&pos);
01052 temp_fpointer=blif;
01053
01054 if(input_count==0)
01055 {
01056 my_fgets (buffer, BUFSIZE, temp_fpointer);
01057 ptr = my_strtok(buffer,"\t\n",temp_fpointer, buffer);
01058 fsetpos(blif,&pos);
01059 if(strcmp(ptr," 0")==0)
01060 return GND_NODE;
01061 else if(strcmp(ptr," 1")==1)
01062 return VCC_NODE;
01063 else if(ptr==NULL)
01064 return GND_NODE;
01065 else
01066 return VCC_NODE;
01067 }
01068
01069 while(1)
01070 {
01071 my_fgets (buffer, BUFSIZE, temp_fpointer);
01072 if(!(buffer[0]=='0' || buffer[0]=='1' || buffer[0]=='-'))
01073 break;
01074
01075 line_count_bitmap++;
01076
01077 ptr = my_strtok(buffer,TOKENS,temp_fpointer, buffer);
01078 bit_map=(char**)realloc(bit_map,sizeof(char*)*line_count_bitmap);
01079 bit_map[line_count_bitmap-1]=(char*)malloc(sizeof(char)*(strlen(ptr)+1));
01080 sprintf(bit_map[line_count_bitmap-1],"%s",ptr);
01081 ptr = my_strtok(NULL,TOKENS,temp_fpointer, buffer);
01082 sprintf(output_bit_map,"%s",ptr);
01083 }
01084
01085 #ifdef debug_mode
01086 printf(" Line_count_bitmap = %d \n",line_count_bitmap);
01087 printf(" input_count= %d \n",input_count);
01088 printf("Printing the extracted bit map \n");
01089 for(i=0;i<line_count_bitmap;i++)
01090 printf("\t: %s \n",bit_map[i]);
01091 #endif
01092
01093 fsetpos(blif,&pos);
01094
01095
01096
01097
01098
01099 if(line_count_bitmap==1)
01100 {
01101
01102 if(strcmp(bit_map[0],"100")==0)
01103 return GT;
01104
01105
01106 if(strcmp(bit_map[0],"010")==0)
01107 return LT;
01108
01109
01110 for(i=0;i<input_count && bit_map[0][i]=='1';i++);
01111 if(i==input_count)
01112 {
01113 if(strcmp(output_bit_map,"1")==0)
01114 return LOGICAL_AND;
01115 else if (strcmp(output_bit_map,"0")==0)
01116 return LOGICAL_NAND;
01117 }
01118
01119
01120 if(strcmp(bit_map[0],"0")==0)
01121 return BITWISE_NOT;
01122
01123
01124 for(i=0;i<input_count && bit_map[0][i]=='0';i++);
01125 if(i==input_count)
01126 {
01127 if(strcmp(output_bit_map,"1")==0)
01128 return LOGICAL_NOR;
01129 else if (strcmp(output_bit_map,"0")==0)
01130 return LOGICAL_OR;
01131 }
01132
01133
01134
01135
01136 }
01137
01138
01139
01140 else if(line_count_bitmap==2)
01141 {
01142
01143 #ifdef debug_mode
01144 printf(" check : %d \n",strcmp(bit_map[0],"01"));
01145 printf(" check : %d \n",strcmp(bit_map[1],"10"));
01146 #endif
01147
01148
01149 if((strcmp(bit_map[0],"01")==0) && (strcmp(bit_map[1],"10")==0))
01150 return LOGICAL_XOR;
01151
01152
01153 if((strcmp(bit_map[0],"00")==0) && (strcmp(bit_map[1],"11")==0)) return LOGICAL_XNOR;
01154 }
01155
01156
01157 else if (line_count_bitmap==4)
01158 {
01159
01160 if((strcmp(bit_map[0],"001")==0) && (strcmp(bit_map[1],"010")==0) && (strcmp(bit_map[2],"100")==0) && (strcmp(bit_map[3],"111")==0))
01161 return ADDER_FUNC;
01162
01163
01164 if((strcmp(bit_map[0],"011")==0) && (strcmp(bit_map[1],"100")==0) && (strcmp(bit_map[2],"110")==0) && (strcmp(bit_map[3],"111")==0))
01165 return CARRY_FUNC;
01166
01167
01168 if((strcmp(bit_map[0],"001")==0) && (strcmp(bit_map[1],"010")==0) && (strcmp(bit_map[2],"100")==0) && (strcmp(bit_map[3],"111")==0))
01169 return LOGICAL_XOR;
01170
01171
01172 if((strcmp(bit_map[0],"000")==0) && (strcmp(bit_map[1],"011")==0) && (strcmp(bit_map[2],"101")==0) && (strcmp(bit_map[3],"110")==0))
01173 return LOGICAL_XNOR;
01174
01175
01176 }
01177
01178 if(line_count_bitmap==input_count)
01179 {
01180
01181 for(i=0;i<line_count_bitmap;i++)
01182 {
01183 if(bit_map[i][i]=='1')
01184 {
01185 for(j=1;j<input_count;j++)
01186 {
01187 if(bit_map[i][(i+j)% input_count]!='-')
01188 break;
01189 }
01190 if(j!=input_count)
01191 break;
01192 }
01193 else break;
01194 }
01195 if(i==line_count_bitmap)
01196 return LOGICAL_OR;
01197
01198
01199
01200 for(i=0;i<line_count_bitmap;i++)
01201 {
01202 if(bit_map[i][i]=='0')
01203 {
01204 for(j=1;j<input_count;j++)
01205 {
01206 if(bit_map[i][(i+j)% input_count]!='-')
01207 break;
01208 }
01209 if(j!=input_count)
01210 break;
01211 }
01212 else break;
01213 }
01214 if(i==line_count_bitmap)
01215 return LOGICAL_NAND;
01216 }
01217
01218
01219 if(line_count_bitmap*2==input_count);
01220 {
01221 for(i=0;i<line_count_bitmap;i++)
01222 {
01223 if((bit_map[i][i]=='1') && (bit_map[i][i+line_count_bitmap] =='1'))
01224 {
01225 for(j=1;j<line_count_bitmap;j++)
01226 {
01227 if((bit_map[i][(i+j)%line_count_bitmap]!='-') || (bit_map[i][((i+j)%line_count_bitmap)+line_count_bitmap]!='-'))
01228 break;
01229 }
01230 if(j!=input_count)
01231 break;
01232 }
01233 else break;
01234 }
01235 if(i==line_count_bitmap)
01236 return MUX_2;
01237 }
01238
01239
01240
01241 node->bit_map=bit_map;
01242 node->bit_map_line_count=line_count_bitmap;
01243 return GENERIC;
01244
01245 }
01246
01247
01248
01249
01250
01251
01252 void add_top_input_nodes()
01253 {
01254
01255 #ifdef debug_mode
01256 printf("\n Reading the add_top_input_nodes");
01257 #endif
01258
01259 long sc_spot;
01260 char *ptr;
01261 char buffer[BUFSIZE];
01262 npin_t *new_pin;
01263 nnet_t *new_net = NULL;
01264 nnode_t *new_node;
01265 char *temp_string;
01266
01267 while (1)
01268 {
01269
01270 ptr = my_strtok (NULL, TOKENS, blif, buffer);
01271
01272 if (ptr == NULL)
01273 return;
01274
01275
01276 new_net= allocate_nnet();
01277 new_node = allocate_nnode();
01278
01279 temp_string= make_full_ref_name(ptr, NULL, NULL,NULL, -1);
01280 sc_spot = sc_add_string(output_nets_sc, temp_string);
01281 if (output_nets_sc->data[sc_spot] != NULL)
01282 {
01283 error_message(NETLIST_ERROR,linenum,-1, "Net (%s) with the same name already created\n",ptr);
01284 }
01285
01286
01287 output_nets_sc->data[sc_spot] = (void*)new_net;
01288
01289 new_node->related_ast_node = NULL;
01290 new_node->type = INPUT_NODE;
01291
01292
01293 new_node->name = temp_string;
01294
01295
01296 allocate_more_node_output_pins(new_node, 1);
01297 add_output_port_information(new_node, 1);
01298
01299
01300 new_pin = allocate_npin();
01301
01302
01303 add_a_output_pin_to_node_spot_idx(new_node, new_pin, 0);
01304 add_a_driver_pin_to_net(new_net, new_pin);
01305
01306
01307
01308
01309 blif_netlist->top_input_nodes = (nnode_t**)realloc(blif_netlist->top_input_nodes, sizeof(nnode_t*)*(blif_netlist->num_top_input_nodes+1));
01310 blif_netlist->top_input_nodes[blif_netlist->num_top_input_nodes] = new_node;
01311 blif_netlist->num_top_input_nodes++;
01312
01313 }
01314
01315 #ifdef debug_mode
01316 printf("\n Exiting the add_top_input_nodes");
01317 #endif
01318
01319 }
01320
01321
01322
01323
01324
01325 void create_top_output_nodes()
01326 {
01327
01328 #ifdef debug_mode
01329 printf("\n reading the create_top_output_nodes\n");
01330 #endif
01331
01332 char *ptr;
01333 char buffer[BUFSIZE];
01334 npin_t *new_pin;
01335 nnode_t *new_node;
01336 char *temp_string;
01337
01338 while (1)
01339 {
01340
01341 ptr = my_strtok (NULL, TOKENS, blif, buffer);
01342
01343 if (ptr == NULL)
01344 return;
01345
01346
01347 new_node = allocate_nnode();
01348
01349 temp_string= make_full_ref_name(ptr, NULL, NULL,NULL, -1);;
01350
01351
01352 new_pin = allocate_npin();
01353 new_pin->name=temp_string;
01354
01355
01356
01357 new_node->related_ast_node = NULL;
01358 new_node->type = OUTPUT_NODE;
01359
01360
01361 new_node->name = temp_string;
01362
01363
01364 allocate_more_node_input_pins(new_node, 1);
01365 add_input_port_information(new_node, 1);
01366
01367
01368
01369
01370 add_a_input_pin_to_node_spot_idx(new_node, new_pin, 0);
01371
01372
01373
01374
01375
01376 blif_netlist->top_output_nodes = (nnode_t**)realloc(blif_netlist->top_output_nodes, sizeof(nnode_t*)*(blif_netlist->num_top_output_nodes+1));
01377 blif_netlist->top_output_nodes[blif_netlist->num_top_output_nodes] = new_node;
01378 blif_netlist->num_top_output_nodes++;
01379
01380 }
01381
01382 #ifdef debug_mode
01383 printf("\n exiting the create_top_output_nodes");
01384 #endif
01385
01386 }
01387
01388
01389
01390
01391
01392
01393 void look_for_clocks()
01394 {
01395 int i;
01396 for (i = 0; i < blif_netlist->num_ff_nodes; i++)
01397 {
01398 if (blif_netlist->ff_nodes[i]->input_pins[1]->net->driver_pin->node->type != CLOCK_NODE)
01399 {
01400 blif_netlist->ff_nodes[i]->input_pins[1]->net->driver_pin->node->type = CLOCK_NODE;
01401 }
01402 }
01403
01404 }
01405
01406
01407
01408
01409
01410
01411
01412
01413
01414
01415
01416
01417 void create_top_driver_nets(char *instance_name_prefix)
01418 {
01419
01420 #ifdef debug_mode
01421 printf("\nin top level driver net function");
01422 #endif
01423
01424 npin_t *new_pin;
01425 long sc_spot;
01426
01427
01428
01429
01430 blif_netlist->zero_net = allocate_nnet();
01431 blif_netlist->gnd_node = allocate_nnode();
01432 blif_netlist->gnd_node->type = GND_NODE;
01433 allocate_more_node_output_pins(blif_netlist->gnd_node, 1);
01434 add_output_port_information(blif_netlist->gnd_node, 1);
01435 new_pin = allocate_npin();
01436 add_a_output_pin_to_node_spot_idx(blif_netlist->gnd_node, new_pin, 0);
01437 add_a_driver_pin_to_net(blif_netlist->zero_net,new_pin);
01438
01439
01440
01441 blif_netlist->one_net = allocate_nnet();
01442 blif_netlist->vcc_node = allocate_nnode();
01443 blif_netlist->vcc_node->type = VCC_NODE;
01444 allocate_more_node_output_pins(blif_netlist->vcc_node, 1);
01445 add_output_port_information(blif_netlist->vcc_node, 1);
01446 new_pin = allocate_npin();
01447 add_a_output_pin_to_node_spot_idx(blif_netlist->vcc_node, new_pin, 0);
01448 add_a_driver_pin_to_net(blif_netlist->one_net, new_pin);
01449
01450
01451
01452 blif_netlist->pad_net = allocate_nnet();
01453 blif_netlist->pad_node = allocate_nnode();
01454 blif_netlist->pad_node->type = PAD_NODE;
01455 allocate_more_node_output_pins(blif_netlist->pad_node, 1);
01456 add_output_port_information(blif_netlist->pad_node, 1);
01457 new_pin = allocate_npin();
01458 add_a_output_pin_to_node_spot_idx(blif_netlist->pad_node, new_pin, 0);
01459 add_a_driver_pin_to_net(blif_netlist->pad_net, new_pin);
01460
01461
01462
01463 blif_zero_string = make_full_ref_name(instance_name_prefix, NULL, NULL, zero_string, -1);
01464 blif_netlist->gnd_node->name = (char *)GND;
01465
01466 sc_spot = sc_add_string(output_nets_sc, (char *)GND);
01467 if (output_nets_sc->data[sc_spot] != NULL)
01468 {
01469 error_message(NETLIST_ERROR,-1,-1, "Error in Odin\n");
01470 }
01471
01472
01473 output_nets_sc->data[sc_spot] = (void*)blif_netlist->zero_net;
01474 blif_netlist->zero_net->name =blif_zero_string;
01475
01476
01477 blif_one_string = make_full_ref_name(instance_name_prefix, NULL, NULL, one_string, -1);
01478 blif_netlist->vcc_node->name = (char *)VCC;
01479
01480 sc_spot = sc_add_string(output_nets_sc, (char *)VCC);
01481 if (output_nets_sc->data[sc_spot] != NULL)
01482 {
01483 error_message(NETLIST_ERROR,-1,-1, "Error in Odin\n");
01484 }
01485
01486 output_nets_sc->data[sc_spot] = (void*)blif_netlist->one_net;
01487 blif_netlist->one_net->name =blif_one_string;
01488
01489
01490 blif_pad_string = make_full_ref_name(instance_name_prefix, NULL, NULL, pad_string, -1);
01491 blif_netlist->pad_node->name = (char *)HBPAD;
01492
01493 sc_spot = sc_add_string(output_nets_sc, (char *)HBPAD);
01494 if (output_nets_sc->data[sc_spot] != NULL)
01495 {
01496 error_message(NETLIST_ERROR, -1,-1, "Error in Odin\n");
01497 }
01498
01499 output_nets_sc->data[sc_spot] = (void*)blif_netlist->pad_net;
01500 blif_netlist->pad_net->name = blif_pad_string;
01501
01502 #ifdef debug_mode
01503 printf("\nexiting the top level driver net module");
01504 #endif
01505
01506 }
01507
01508
01509
01510
01511 static void dum_parse (char *buffer)
01512 {
01513
01514 while (my_strtok (NULL, TOKENS, blif, buffer) != NULL);
01515 }
01516
01517
01518
01519
01520
01521
01522
01523 void hook_up_nets()
01524 {
01525 int i,j;
01526 char * name_pin;
01527 int input_pin_count=0;
01528 npin_t * input_pin;
01529 nnet_t * output_net;
01530 nnode_t * node;
01531 long sc_spot;
01532
01533
01534 for(i=0;i<blif_netlist->num_internal_nodes;i++)
01535 {
01536 node=blif_netlist->internal_nodes[i];
01537 input_pin_count=node->num_input_pins;
01538 for(j=0;j<input_pin_count;j++)
01539 {
01540 input_pin=node->input_pins[j];
01541 name_pin=input_pin->name;
01542 sc_spot=sc_lookup_string(output_nets_sc,name_pin);
01543 if(sc_spot==(-1))
01544 {
01545 printf("Error :Could not hook the pin %s not available ",name_pin);
01546 exit(-1);
01547 }
01548 output_net=(nnet_t*)output_nets_sc->data[sc_spot];
01549
01550
01551 add_a_fanout_pin_to_net(output_net,input_pin);
01552 }
01553 }
01554
01555
01556 for(i=0;i<blif_netlist->num_ff_nodes;i++)
01557 {
01558 node=blif_netlist->ff_nodes[i];
01559 input_pin_count=node->num_input_pins;
01560 for(j=0;j<input_pin_count;j++)
01561 {
01562 input_pin=node->input_pins[j];
01563 name_pin=input_pin->name;
01564 sc_spot=sc_lookup_string(output_nets_sc,name_pin);
01565 if(sc_spot==(-1))
01566 {
01567 printf("Error :Could not hook the pin %s not available ",name_pin);
01568 exit(-1);
01569 }
01570 output_net=(nnet_t*)output_nets_sc->data[sc_spot];
01571
01572 add_a_fanout_pin_to_net(output_net,input_pin);
01573
01574 }
01575 }
01576
01577
01578 for(i=0;i<blif_netlist->num_top_output_nodes;i++)
01579 {
01580 node=blif_netlist->top_output_nodes[i];
01581 input_pin_count=node->num_input_pins;
01582 for(j=0;j<input_pin_count;j++)
01583 {
01584 input_pin=node->input_pins[j];
01585 name_pin=input_pin->name;
01586 sc_spot=sc_lookup_string(output_nets_sc,name_pin);
01587 if(sc_spot==(-1))
01588 {
01589 printf("Error:Could not hook the pin %s not available ",name_pin);
01590 exit(-1);
01591 }
01592 output_net=(nnet_t*)output_nets_sc->data[sc_spot];
01593
01594 add_a_fanout_pin_to_net(output_net,input_pin);
01595
01596 }
01597
01598 }
01599 }
01600
01601
01602
01603
01604
01605
01606
01607
01608