VIS

src/ntk/ntkNode.c

Go to the documentation of this file.
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