VIS
|
00001 00032 #include "ntkInt.h" 00033 #include "baig.h" 00034 00035 static char rcsid[] UNUSED = "$Id: ntkNode.c,v 1.15 2009/04/11 01:56:10 fabio Exp $"; 00036 00037 /*---------------------------------------------------------------------------*/ 00038 /* Constant declarations */ 00039 /*---------------------------------------------------------------------------*/ 00040 #define UNASSIGNED_OUTPUT_INDEX -1 00041 #define LATCH_DATA 0 00042 #define LATCH_INITIAL 1 00043 00044 00045 00048 /*---------------------------------------------------------------------------*/ 00049 /* Static function prototypes */ 00050 /*---------------------------------------------------------------------------*/ 00051 00052 static void NetworkAddCombOutput(Ntk_Network_t *network, Ntk_Node_t *node); 00053 00057 /*---------------------------------------------------------------------------*/ 00058 /* Definition of exported functions */ 00059 /*---------------------------------------------------------------------------*/ 00060 00074 char * 00075 Ntk_NodeReadName( 00076 Ntk_Node_t * node) 00077 { 00078 assert(node != NIL(Ntk_Node_t)); 00079 return (node->name); 00080 } 00081 00082 00096 Ntk_Network_t * 00097 Ntk_NodeReadNetwork( 00098 Ntk_Node_t * node) 00099 { 00100 assert(node != NIL(Ntk_Node_t)); 00101 return (node->network); 00102 } 00103 00104 00125 Var_Variable_t * 00126 Ntk_NodeReadVariable( 00127 Ntk_Node_t * node) 00128 { 00129 assert(node != NIL(Ntk_Node_t)); 00130 return (node->variable); 00131 } 00132 00133 00149 Tbl_Table_t * 00150 Ntk_NodeReadTable( 00151 Ntk_Node_t * node) 00152 { 00153 assert(node != NIL(Ntk_Node_t)); 00154 assert((node->type == NtkCombinational_c) || (node->type == NtkPseudoInput_c)); 00155 return (node->table); 00156 } 00157 00169 mAigEdge_t 00170 Ntk_NodeReadMAigId( 00171 Ntk_Node_t * node) 00172 { 00173 assert(node != NIL(Ntk_Node_t)); 00174 return (node->mAigId); 00175 } 00176 00177 00189 void 00190 Ntk_NodeSetMAigId( 00191 Ntk_Node_t * node, 00192 mAigEdge_t mAigId) 00193 { 00194 assert(node != NIL(Ntk_Node_t)); 00195 node->mAigId = mAigId; 00196 } 00197 00219 void 00220 Ntk_NodeSetTable( 00221 Ntk_Node_t * node, 00222 Tbl_Table_t *table) 00223 { 00224 00225 assert(node != NIL(Ntk_Node_t)); 00226 assert((node->type == NtkCombinational_c) || (node->type == NtkPseudoInput_c)); 00227 00228 node->table = table; 00229 } 00230 00245 int 00246 Ntk_NodeReadOutputIndex( 00247 Ntk_Node_t * node) 00248 { 00249 assert(node != NIL(Ntk_Node_t)); 00250 assert((node->type == NtkCombinational_c) || (node->type == NtkPseudoInput_c)); 00251 return (node->outputIndex); 00252 } 00253 00254 00269 int 00270 Ntk_NodeReadMddId( 00271 Ntk_Node_t * node) 00272 { 00273 assert(node != NIL(Ntk_Node_t)); 00274 return (node->mddId); 00275 } 00276 00277 00297 void 00298 Ntk_NodeSetMddId( 00299 Ntk_Node_t * node, 00300 int id) 00301 { 00302 Ntk_Network_t *network = node->network; 00303 char *entry; 00304 00305 assert(node != NIL(Ntk_Node_t)); 00306 00307 /* If the node already has an assigned id, then clean it from the table. */ 00308 if (node->mddId != NTK_UNASSIGNED_MDD_ID) { 00309 entry = (char *) (long) node->mddId; 00310 (void) st_delete(network->mddIdToNode, &entry, NIL(char *)); 00311 } 00312 00313 /* Set the new id, and add it to the table (if it's not unassigned). */ 00314 node->mddId = id; 00315 if (id != NTK_UNASSIGNED_MDD_ID) { 00316 st_insert(network->mddIdToNode, (char *) (long) id, (char *) node); 00317 } 00318 } 00319 00320 00336 void * 00337 Ntk_NodeReadUndef( 00338 Ntk_Node_t * node) 00339 { 00340 assert(node != NIL(Ntk_Node_t)); 00341 return (node->undef); 00342 } 00343 00344 00358 void 00359 Ntk_NodeSetUndef( 00360 Ntk_Node_t * node, 00361 void * value) 00362 { 00363 assert(node != NIL(Ntk_Node_t)); 00364 node->undef = value; 00365 } 00366 00367 00382 boolean 00383 Ntk_NodeTestIsPrimaryInput( 00384 Ntk_Node_t * node) 00385 { 00386 assert(node != NIL(Ntk_Node_t)); 00387 return (node->type == NtkPrimaryInput_c); 00388 } 00389 00390 00405 boolean 00406 Ntk_NodeTestIsPseudoInput( 00407 Ntk_Node_t * node) 00408 { 00409 assert(node != NIL(Ntk_Node_t)); 00410 return (node->type == NtkPseudoInput_c); 00411 } 00412 00413 00427 boolean 00428 Ntk_NodeTestIsInput( 00429 Ntk_Node_t * node) 00430 { 00431 assert(node != NIL(Ntk_Node_t)); 00432 return ((node->type == NtkPrimaryInput_c) || (node->type == NtkPseudoInput_c)); 00433 00434 } 00435 00436 00450 boolean 00451 Ntk_NodeTestIsUndefined( 00452 Ntk_Node_t * node) 00453 { 00454 assert(node != NIL(Ntk_Node_t)); 00455 return (node->type == NtkUnassigned_c); 00456 } 00457 00458 00472 boolean 00473 Ntk_NodeTestIsLatch( 00474 Ntk_Node_t * node) 00475 { 00476 assert(node != NIL(Ntk_Node_t)); 00477 return (node->type == NtkLatch_c); 00478 } 00479 00480 00494 boolean 00495 Ntk_NodeTestIsNextStateNode( 00496 Ntk_Node_t * node) 00497 { 00498 assert(node != NIL(Ntk_Node_t)); 00499 if (Ntk_NodeTestIsShadow(node)) { 00500 Ntk_Node_t *origin = Ntk_ShadowReadOrigin(node); 00501 if (Ntk_NodeTestIsLatch(origin)) { 00502 return (TRUE); 00503 } 00504 } 00505 00506 return (FALSE); 00507 } 00508 00509 00523 boolean 00524 Ntk_NodeTestIsShadow( 00525 Ntk_Node_t * node) 00526 { 00527 assert(node != NIL(Ntk_Node_t)); 00528 return (node->type == NtkShadow_c); 00529 } 00530 00531 00546 boolean 00547 Ntk_NodeTestIsCombInput( 00548 Ntk_Node_t * node) 00549 { 00550 assert(node != NIL(Ntk_Node_t)); 00551 return ((node->type == NtkLatch_c) 00552 || (node->type == NtkPrimaryInput_c) 00553 || (node->type == NtkPseudoInput_c)); 00554 } 00555 00556 00571 boolean 00572 Ntk_NodeTestIsCombOutput( 00573 Ntk_Node_t * node) 00574 { 00575 assert(node != NIL(Ntk_Node_t)); 00576 return (Ntk_NodeTestIsPrimaryOutput(node) 00577 || Ntk_NodeTestIsLatchDataInput(node) 00578 || Ntk_NodeTestIsLatchInitialInput(node)); 00579 } 00580 00581 00595 boolean 00596 Ntk_NodeTestIsCombinational( 00597 Ntk_Node_t * node) 00598 { 00599 assert(node != NIL(Ntk_Node_t)); 00600 return (node->type == NtkCombinational_c); 00601 } 00602 00603 00619 boolean 00620 Ntk_NodeTestIsPrimaryOutput( 00621 Ntk_Node_t * node) 00622 { 00623 assert(node != NIL(Ntk_Node_t)); 00624 return (node->outputFlag); 00625 } 00626 00627 00642 boolean 00643 Ntk_NodeTestIsLatchDataInput( 00644 Ntk_Node_t * node) 00645 { 00646 assert(node != NIL(Ntk_Node_t)); 00647 return (node->latchDataInput); 00648 } 00649 00650 00666 boolean 00667 Ntk_NodeTestIsLatchInitialInput( 00668 Ntk_Node_t * node) 00669 { 00670 assert(node != NIL(Ntk_Node_t)); 00671 return (node->latchInitialInput); 00672 } 00673 00674 00688 boolean 00689 Ntk_NodeTestIsConstant( 00690 Ntk_Node_t * node) 00691 { 00692 assert(node != NIL(Ntk_Node_t)); 00693 return (node->constant); 00694 } 00695 00696 00711 Ntk_Node_t * 00712 Ntk_NodeReadShadow( 00713 Ntk_Node_t * node) 00714 { 00715 assert(node != NIL(Ntk_Node_t)); 00716 assert(node->type != NtkShadow_c); 00717 return (node->shadowInfo.shadow); 00718 } 00719 00720 00736 Ntk_Node_t * 00737 Ntk_ShadowReadOrigin( 00738 Ntk_Node_t * shadow) 00739 { 00740 assert(shadow != NIL(Ntk_Node_t)); 00741 assert(shadow->type == NtkShadow_c); 00742 return (shadow->shadowInfo.origin); 00743 } 00744 00745 00759 Ntk_Node_t * 00760 Ntk_LatchReadDataInput( 00761 Ntk_Node_t * node) 00762 { 00763 Ntk_Node_t *data; 00764 00765 assert(node != NIL(Ntk_Node_t)); 00766 assert(node->type == NtkLatch_c); 00767 data = array_fetch(Ntk_Node_t *, node->fanins, LATCH_DATA); 00768 00769 return (data); 00770 } 00771 00772 00786 Ntk_Node_t * 00787 Ntk_LatchReadInitialInput( 00788 Ntk_Node_t * node) 00789 { 00790 Ntk_Node_t *initial; 00791 00792 assert(node != NIL(Ntk_Node_t)); 00793 assert(node->type == NtkLatch_c); 00794 initial = array_fetch(Ntk_Node_t *, node->fanins, LATCH_INITIAL); 00795 00796 return (initial); 00797 } 00798 00799 00809 int 00810 Ntk_NodeReadNumFanins( 00811 Ntk_Node_t * node) 00812 { 00813 assert(node != NIL(Ntk_Node_t)); 00814 return (array_n(node->fanins)); 00815 } 00816 00817 00827 int 00828 Ntk_NodeReadNumFanouts( 00829 Ntk_Node_t * node) 00830 { 00831 assert(node != NIL(Ntk_Node_t)); 00832 return (array_n(node->fanouts)); 00833 } 00834 00835 00848 Ntk_Node_t * 00849 Ntk_NodeReadFaninNode( 00850 Ntk_Node_t * node, 00851 int faninIndex) 00852 { 00853 Ntk_Node_t *faninNode; 00854 00855 assert(node != NIL(Ntk_Node_t)); 00856 assert((faninIndex >= 0) && (faninIndex < Ntk_NodeReadNumFanins(node))); 00857 faninNode = array_fetch(Ntk_Node_t *, node->fanins, faninIndex); 00858 return (faninNode); 00859 } 00860 00861 00874 int 00875 Ntk_NodeReadFaninIndex( 00876 Ntk_Node_t * node, 00877 Ntk_Node_t * faninNode) 00878 { 00879 int i; 00880 Ntk_Node_t *tempNode; 00881 00882 assert(node != NIL(Ntk_Node_t)); 00883 Ntk_NodeForEachFanin(node, i, tempNode) { 00884 if (tempNode == faninNode) { 00885 return (i); 00886 } 00887 } 00888 00889 return (NTK_UNDEFINED_FANIN_INDEX); 00890 } 00891 00892 00905 array_t * 00906 Ntk_NodeReadFanins( 00907 Ntk_Node_t * node) 00908 { 00909 assert(node != NIL(Ntk_Node_t)); 00910 return (node->fanins); 00911 } 00912 00913 00926 array_t * 00927 Ntk_NodeReadFanouts( 00928 Ntk_Node_t * node) 00929 { 00930 assert(node != NIL(Ntk_Node_t)); 00931 return (node->fanouts); 00932 } 00933 00934 00947 void 00948 Ntk_NodeSetFanins( 00949 Ntk_Node_t * node, 00950 array_t *faninArray) 00951 { 00952 assert(node != NIL(Ntk_Node_t)); 00953 if (node->fanins) 00954 array_free(node->fanins); 00955 00956 node->fanins = faninArray; 00957 00958 return; 00959 } 00960 00961 00974 void 00975 Ntk_NodeSetFanouts( 00976 Ntk_Node_t * node, 00977 array_t *fanoutArray) 00978 { 00979 assert(node != NIL(Ntk_Node_t)); 00980 if (node->fanouts) 00981 array_free(node->fanouts); 00982 00983 node->fanouts = fanoutArray; 00984 00985 return; 00986 } 00987 00988 01003 char * 01004 Ntk_NodeObtainTypeAsString( 01005 Ntk_Node_t * node) 01006 { 01007 char *typeString; 01008 01009 assert(node != NIL(Ntk_Node_t)); 01010 switch(node->type) { 01011 case NtkLatch_c: 01012 typeString = util_strsav("latch"); 01013 break; 01014 case NtkShadow_c: 01015 typeString = util_strsav("shadow"); 01016 break; 01017 case NtkPrimaryInput_c: 01018 typeString = util_strsav("primary-input"); 01019 break; 01020 case NtkPseudoInput_c: 01021 typeString = util_strsav("pseudo-input"); 01022 break; 01023 case NtkCombinational_c: 01024 typeString = util_strsav("combinational"); 01025 break; 01026 case NtkUnassigned_c: 01027 typeString = util_strsav("unassigned"); 01028 break; 01029 default: 01030 fail("Unexpected type"); 01031 } 01032 return (typeString); 01033 } 01034 01035 01050 void 01051 Ntk_NodePrint( 01052 FILE * fp, 01053 Ntk_Node_t * node, 01054 boolean printIo, 01055 boolean printTableStats) 01056 { 01057 int i; 01058 Ntk_Node_t *fanin; 01059 Ntk_Node_t *fanout; 01060 char *typeString = Ntk_NodeObtainTypeAsString(node); 01061 01062 01063 /* 01064 * Print the node's name, MDD id, type, and attributes. 01065 */ 01066 (void) fprintf(fp, "%s: mdd=%d, %s;%s%s%s%s%s%s\n", 01067 Ntk_NodeReadName(node), 01068 Ntk_NodeReadMddId(node), 01069 typeString, 01070 (Ntk_NodeTestIsPrimaryOutput(node) ? " output" : ""), 01071 (Ntk_NodeTestIsConstant(node) ? " constant" : ""), 01072 (Ntk_NodeTestIsLatchDataInput(node) ? " data-input" : ""), 01073 (Ntk_NodeTestIsLatchInitialInput(node) ? " initial-input" : ""), 01074 (Ntk_NodeTestIsCombInput(node) ? " comb-input" : ""), 01075 (Ntk_NodeTestIsCombOutput(node) ? " comb-output" : "") 01076 ); 01077 01078 FREE(typeString); 01079 01080 if (printIo) { 01081 /* 01082 * Print the name of each fanin. 01083 */ 01084 (void) fprintf(fp, "Fanins: "); 01085 Ntk_NodeForEachFanin(node, i, fanin) { 01086 if (i != 0) (void) fprintf(fp, ","); 01087 (void) fprintf(fp, " %s", Ntk_NodeReadName(fanin)); 01088 } 01089 (void) fprintf(fp, "\n"); 01090 01091 /* 01092 * Print the name of each fanout. 01093 */ 01094 (void) fprintf(fp, "Fanouts: "); 01095 Ntk_NodeForEachFanout(node, i, fanout) { 01096 if (i != 0) (void) fprintf(fp, ","); 01097 (void) fprintf(fp, " %s", Ntk_NodeReadName(fanout)); 01098 } 01099 (void) fprintf(fp, "\n"); 01100 } 01101 01102 if (printTableStats) { 01103 if (Ntk_NodeTestIsCombinational(node) || Ntk_NodeTestIsPseudoInput(node)) { 01104 Tbl_TablePrintStats(Ntk_NodeReadTable(node), fp); 01105 } 01106 } 01107 } 01108 01109 01128 Ntk_Node_t * 01129 Ntk_NodeCreateInNetwork( 01130 Ntk_Network_t * network, 01131 char * name, 01132 Var_Variable_t *variable) 01133 { 01134 Ntk_Node_t *node = ALLOC(Ntk_Node_t, 1); 01135 01136 assert(network != NIL(Ntk_Network_t)); 01137 assert(name != NIL(char)); 01138 assert(variable != NIL(Var_Variable_t)); 01139 01140 node->name = util_strsav(name); 01141 node->network = network; 01142 node->variable = variable; 01143 node->type = NtkUnassigned_c; 01144 node->fanins = array_alloc(Ntk_Node_t *, 0); 01145 node->fanouts = array_alloc(Ntk_Node_t *, 0); 01146 node->table = NIL(Tbl_Table_t); 01147 node->outputIndex = UNASSIGNED_OUTPUT_INDEX; 01148 node->mddId = NTK_UNASSIGNED_MDD_ID; 01149 node->mAigId = -1; 01150 node->shadowInfo.shadow = NIL(Ntk_Node_t); 01151 node->outputFlag = 0; 01152 node->constant = 0; 01153 node->latchDataInput = 0; 01154 node->latchInitialInput = 0; 01155 node->undef = NIL(void); 01156 01157 /* 01158 * Update the state of the network. Note: it's important to use node->name 01159 * here, rather than just name, because we don't own name. 01160 */ 01161 st_insert(network->actualNameToNode, (char *) node->name, (char *) node); 01162 lsNewEnd(network->nodes, (lsGeneric) node, LS_NH); 01163 01164 return (node); 01165 } 01166 01167 01188 void 01189 Ntk_NodeDeclareAsCombinational( 01190 Ntk_Node_t * node, 01191 Tbl_Table_t * table, 01192 array_t * inputNames /* array of char */, 01193 int outputIndex) 01194 { 01195 int i; 01196 Ntk_Network_t *network = node->network; 01197 01198 assert(node->type == NtkUnassigned_c); 01199 01200 node->type = NtkCombinational_c; 01201 node->table = table; 01202 node->outputIndex = outputIndex; 01203 01204 /* 01205 * If it can be determined that the corresponding output column of table can 01206 * take assume just a single value, then set the constant flag. 01207 */ 01208 if (Tbl_TableTestIsConstant(table, outputIndex)) { 01209 node->constant = 1; 01210 } 01211 01212 /* 01213 * Create a connection to each input of table. 01214 */ 01215 for (i = 0; i < array_n(inputNames); i++) { 01216 char *faninName = array_fetch(char *, inputNames, i); 01217 Ntk_Node_t *fanin = Ntk_NetworkFindNodeByName(network, faninName); 01218 01219 assert(fanin != NIL(Ntk_Node_t)); 01220 01221 /* 01222 * Make the connections between node and fanin. Note: it is critical 01223 * that the fanins of node are added to node->fanins in the same order 01224 * they appear in the table. 01225 */ 01226 array_insert_last(Ntk_Node_t *, fanin->fanouts, node); 01227 array_insert_last(Ntk_Node_t *, node->fanins, fanin); 01228 } 01229 } 01230 01231 01250 void 01251 Ntk_NodeDeclareAsLatch( 01252 Ntk_Node_t * latch, 01253 char * dataName, 01254 char * initName) 01255 { 01256 Ntk_Node_t *dataNode; 01257 Ntk_Node_t *initNode; 01258 Ntk_Network_t *network = latch->network; 01259 01260 assert(latch->type == NtkUnassigned_c); 01261 latch->type = NtkLatch_c; 01262 01263 /* 01264 * Get the nodes corresponding to dataName and initName. 01265 */ 01266 dataNode = Ntk_NetworkFindNodeByName(network, dataName); 01267 initNode = Ntk_NetworkFindNodeByName(network, initName); 01268 assert(dataNode != NIL(Ntk_Node_t)); 01269 assert(initNode != NIL(Ntk_Node_t)); 01270 01271 /* 01272 * Make the necessary connections. Note the predefined locations of the data 01273 * and initial inputs in the fanin array of latch. 01274 */ 01275 array_insert(Ntk_Node_t *, latch->fanins, LATCH_DATA, dataNode); 01276 array_insert(Ntk_Node_t *, latch->fanins, LATCH_INITIAL, initNode); 01277 01278 array_insert_last(Ntk_Node_t *, dataNode->fanouts, latch); 01279 array_insert_last(Ntk_Node_t *, initNode->fanouts, latch); 01280 01281 /* 01282 * Set the special flags in the data and init nodes, and add them to the 01283 * list of combinational outputs. 01284 */ 01285 dataNode->latchDataInput = 1; 01286 NetworkAddCombOutput(network, dataNode); 01287 01288 initNode->latchInitialInput = 1; 01289 NetworkAddCombOutput(network, initNode); 01290 01291 /* 01292 * Add the latch to the appropriate lists in network. 01293 */ 01294 lsNewEnd(network->latches, (lsGeneric) latch, LS_NH); 01295 lsNewEnd(network->combInputs, (lsGeneric) latch, LS_NH); 01296 } 01297 01298 01311 void 01312 Ntk_NodeDeclareAsPrimaryInput( 01313 Ntk_Node_t * node) 01314 { 01315 assert(node->type == NtkUnassigned_c); 01316 node->type = NtkPrimaryInput_c; 01317 01318 lsNewEnd(node->network->primaryInputs, (lsGeneric) node, LS_NH); 01319 lsNewEnd(node->network->inputs, (lsGeneric) node, LS_NH); 01320 lsNewEnd(node->network->combInputs, (lsGeneric) node, LS_NH); 01321 } 01322 01323 01340 void 01341 Ntk_NodeDeclareAsPseudoInput( 01342 Ntk_Node_t * node, 01343 Tbl_Table_t * table, 01344 int outputIndex) 01345 { 01346 assert(node->type == NtkUnassigned_c); 01347 01348 node->type = NtkPseudoInput_c; 01349 node->table = table; 01350 node->outputIndex = outputIndex; 01351 01352 if (Tbl_TableTestIsConstant(table, outputIndex)) { 01353 node->constant = 1; 01354 } 01355 01356 lsNewEnd(node->network->pseudoInputs, (lsGeneric) node, LS_NH); 01357 lsNewEnd(node->network->inputs, (lsGeneric) node, LS_NH); 01358 lsNewEnd(node->network->combInputs, (lsGeneric) node, LS_NH); 01359 } 01360 01361 01374 void 01375 Ntk_NodeDeclareAsPrimaryOutput( 01376 Ntk_Node_t * node) 01377 { 01378 assert(node->type != NtkShadow_c); 01379 node->outputFlag = 1; 01380 lsNewEnd(node->network->primaryOutputs, (lsGeneric) node, LS_NH); 01381 NetworkAddCombOutput(node->network, node); 01382 } 01383 01384 01400 void 01401 Ntk_NodeDeclareAsShadow( 01402 Ntk_Node_t * shadow, 01403 Ntk_Node_t * origin) 01404 { 01405 assert(shadow->type == NtkUnassigned_c); 01406 assert(origin->type != NtkShadow_c); 01407 01408 shadow->type = NtkShadow_c; 01409 01410 shadow->shadowInfo.origin = origin; 01411 origin->shadowInfo.shadow = shadow; 01412 } 01413 01414 01430 void 01431 Ntk_NodeFree( 01432 Ntk_Node_t * node) 01433 { 01434 FREE(node->name); 01435 array_free(node->fanins); 01436 array_free(node->fanouts); 01437 Tbl_TableFree(node->table); 01438 01439 /* 01440 * Unassign a few key fields for safety's sake. 01441 */ 01442 node->name = NIL(char); 01443 node->network = NIL(Ntk_Network_t); 01444 node->variable = NIL(Var_Variable_t); 01445 node->type = NtkUnassigned_c; 01446 node->fanins = NIL(array_t); 01447 node->fanouts = NIL(array_t); 01448 node->table = NIL(Tbl_Table_t); 01449 node->mddId = NTK_UNASSIGNED_MDD_ID; 01450 01451 FREE(node); 01452 } 01453 01454 01455 /*---------------------------------------------------------------------------*/ 01456 /* Definition of internal functions */ 01457 /*---------------------------------------------------------------------------*/ 01458 01459 01460 /*---------------------------------------------------------------------------*/ 01461 /* Definition of static functions */ 01462 /*---------------------------------------------------------------------------*/ 01476 static void 01477 NetworkAddCombOutput( 01478 Ntk_Network_t *network, 01479 Ntk_Node_t *node) 01480 { 01481 if (!st_is_member(network->combOutputsTable, (char *) node)) { 01482 st_insert(network->combOutputsTable, (char *) node, (char *) 0); 01483 lsNewEnd(network->combOutputs, (lsGeneric) node, LS_NH); 01484 } 01485 } 01486 01487 01488 01489 01490