| [14] | 1 | /**CFile*********************************************************************** |
|---|
| 2 | |
|---|
| 3 | FileName [partCmd.c] |
|---|
| 4 | |
|---|
| 5 | PackageName [part] |
|---|
| 6 | |
|---|
| 7 | Synopsis [Command interface for the partition package.] |
|---|
| 8 | |
|---|
| 9 | Author [Abelardo Pardo] |
|---|
| 10 | |
|---|
| 11 | Copyright [This file was created at the University of Colorado at |
|---|
| 12 | Boulder. The University of Colorado at Boulder makes no warranty |
|---|
| 13 | about the suitability of this software for any purpose. It is |
|---|
| 14 | presented on an AS IS basis.] |
|---|
| 15 | |
|---|
| 16 | ******************************************************************************/ |
|---|
| 17 | |
|---|
| 18 | #include "partInt.h" |
|---|
| 19 | |
|---|
| 20 | static char rcsid[] UNUSED = "$Id: partCmd.c,v 1.22 2009/04/11 01:47:18 fabio Exp $"; |
|---|
| 21 | |
|---|
| 22 | /*---------------------------------------------------------------------------*/ |
|---|
| 23 | /* Variable declarations */ |
|---|
| 24 | /*---------------------------------------------------------------------------*/ |
|---|
| 25 | /**Variable******************************************************************** |
|---|
| 26 | |
|---|
| 27 | Synopsis [Buffer to store the environment in a setjmp call] |
|---|
| 28 | |
|---|
| 29 | SeeAlso [TimeOutHandle] |
|---|
| 30 | |
|---|
| 31 | ******************************************************************************/ |
|---|
| 32 | static jmp_buf timeOutEnv; |
|---|
| 33 | |
|---|
| 34 | /**AutomaticStart*************************************************************/ |
|---|
| 35 | |
|---|
| 36 | /*---------------------------------------------------------------------------*/ |
|---|
| 37 | /* Static function prototypes */ |
|---|
| 38 | /*---------------------------------------------------------------------------*/ |
|---|
| 39 | |
|---|
| 40 | static int CommandBuildPartitionMdds(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
|---|
| 41 | static int CommandPrintPartition(Hrc_Manager_t **hmgr, int argc, char **argv); |
|---|
| 42 | static int CommandPrintPartitionStats(Hrc_Manager_t **hmgr, int argc, char **argv); |
|---|
| 43 | static void TimeOutHandle(void); |
|---|
| 44 | |
|---|
| 45 | /**AutomaticEnd***************************************************************/ |
|---|
| 46 | |
|---|
| 47 | |
|---|
| 48 | /*---------------------------------------------------------------------------*/ |
|---|
| 49 | /* Definition of exported functions */ |
|---|
| 50 | /*---------------------------------------------------------------------------*/ |
|---|
| 51 | |
|---|
| 52 | /**Function******************************************************************** |
|---|
| 53 | |
|---|
| 54 | Synopsis [Initializes the partitioning package.] |
|---|
| 55 | |
|---|
| 56 | SideEffects [] |
|---|
| 57 | |
|---|
| 58 | SeeAlso [Part_End] |
|---|
| 59 | |
|---|
| 60 | ******************************************************************************/ |
|---|
| 61 | void |
|---|
| 62 | Part_Init(void) |
|---|
| 63 | { |
|---|
| 64 | Cmd_CommandAdd("build_partition_mdds", CommandBuildPartitionMdds, |
|---|
| 65 | 0/* doesn't change network */); |
|---|
| 66 | Cmd_CommandAdd("print_partition", CommandPrintPartition, |
|---|
| 67 | 0/* doesn't change network */); |
|---|
| 68 | Cmd_CommandAdd("print_partition_stats", CommandPrintPartitionStats, |
|---|
| 69 | 0/* doesn't change network*/); |
|---|
| 70 | } /* End of Part_Init */ |
|---|
| 71 | |
|---|
| 72 | |
|---|
| 73 | /**Function******************************************************************** |
|---|
| 74 | |
|---|
| 75 | Synopsis [Ends the partitioning package.] |
|---|
| 76 | |
|---|
| 77 | SideEffects [] |
|---|
| 78 | |
|---|
| 79 | SeeAlso [Part_Init] |
|---|
| 80 | |
|---|
| 81 | ******************************************************************************/ |
|---|
| 82 | void |
|---|
| 83 | Part_End(void) |
|---|
| 84 | { |
|---|
| 85 | } /* End of Part_End */ |
|---|
| 86 | |
|---|
| 87 | /*---------------------------------------------------------------------------*/ |
|---|
| 88 | /* Definition of internal functions */ |
|---|
| 89 | /*---------------------------------------------------------------------------*/ |
|---|
| 90 | |
|---|
| 91 | |
|---|
| 92 | /*---------------------------------------------------------------------------*/ |
|---|
| 93 | /* Definition of static functions */ |
|---|
| 94 | /*---------------------------------------------------------------------------*/ |
|---|
| 95 | |
|---|
| 96 | /**Function******************************************************************** |
|---|
| 97 | |
|---|
| 98 | Synopsis [Implements the build_partition_mdds command.] |
|---|
| 99 | |
|---|
| 100 | Description [The data structure needed to store the information |
|---|
| 101 | related to the partitioning process will be stored in a graph_t |
|---|
| 102 | structure that will become part of the network. This procedure |
|---|
| 103 | checks if the network has already registered this application. If |
|---|
| 104 | not, a new structure is allocated. After this process, depending on |
|---|
| 105 | the type of method specified in the command line, the specific |
|---|
| 106 | routine is executed. The user may set the specific flag |
|---|
| 107 | <tt>partition_method</tt> as the default to be used whenever no |
|---|
| 108 | method is specified in the command line. If no flag is defined, the |
|---|
| 109 | <tt>frontier</tt> method will be used.] |
|---|
| 110 | |
|---|
| 111 | CommandName [build_partition_mdds] |
|---|
| 112 | |
|---|
| 113 | CommandSynopsis [build a partition of MDDs for the flattened network] |
|---|
| 114 | |
|---|
| 115 | CommandArguments [\[-h\] \[-i\] \[-n <list>\] \[-s <num>\] \[-t |
|---|
| 116 | <seconds>\] \[-v\] \[<method>\]] |
|---|
| 117 | |
|---|
| 118 | CommandDescription [Build the MDDs of a flattened network. Depending on the |
|---|
| 119 | <tt>method</tt> selected, the MDDs for the combinational outputs (COs) are |
|---|
| 120 | built in terms of either the combinational inputs (CIs) or in terms of some |
|---|
| 121 | subset of intermediate nodes of the network. The MDDs built are stored in a |
|---|
| 122 | DAG called a "partition". The vertices of a partition correspond to the |
|---|
| 123 | CIs, COs, and any intermediate nodes used. Each vertex has a multi-valued |
|---|
| 124 | function (represented by MDDs) expressing the function of the corresponding |
|---|
| 125 | network node in terms of the partition vertices in its transitive fanin. |
|---|
| 126 | Hence, the MDDs of the partition represent a partial collapsing of the |
|---|
| 127 | network.<p> |
|---|
| 128 | |
|---|
| 129 | This command must be preceded by the commands <tt>flatten_hierarchy</tt> and |
|---|
| 130 | <tt>static_order</tt>. The partition built is stored with the network for |
|---|
| 131 | use by other commands, such as <tt>simulate</tt>, <tt>compute_reach</tt>, |
|---|
| 132 | <tt>model_check</tt>, etc. This command has no affect when invoked on a |
|---|
| 133 | network that already has a partition. To remove the existing partition of a |
|---|
| 134 | network, reinvoke <tt>flatten_hierarchy</tt>.<p> |
|---|
| 135 | |
|---|
| 136 | The choice of <tt>method</tt> determines which intermediate nodes are |
|---|
| 137 | used. The <tt>inout</tt> method represents one extreme where no intermediate |
|---|
| 138 | nodes are used, and <tt>total</tt> represents the other extreme where every |
|---|
| 139 | node in the network has a corresponding vertex in the partition. If no |
|---|
| 140 | <tt>method</tt> is specified on the command line, then the value of the flag |
|---|
| 141 | <tt>partition_method</tt> is used (this flag is set by the command <tt>set |
|---|
| 142 | partition_method</tt>), unless it does not have a value, in which case the |
|---|
| 143 | <tt>forntier</tt> method is used. The different methods available are: |
|---|
| 144 | |
|---|
| 145 | <dl> |
|---|
| 146 | <li> <tt>inout</tt> Expresses the combinational |
|---|
| 147 | outputs in terms of the combinational inputs. |
|---|
| 148 | |
|---|
| 149 | <li> <tt>total</tt> The partition built is isomorphic to the combinational |
|---|
| 150 | part of the network. The function of each node is expressed in terms of its |
|---|
| 151 | immediate fanins. If the <tt>-i</tt> is used the function attached to each |
|---|
| 152 | vertex is computed as a function of the combinational inputs. |
|---|
| 153 | |
|---|
| 154 | <li> <tt>partial</tt> Builds a partition using the intermediate nodes specified |
|---|
| 155 | with the <tt>-n</tt> option or the <tt>-f</tt> option. |
|---|
| 156 | |
|---|
| 157 | <li> <tt>frontier</tt> (default) Builds a partition creating vertices for the intermediate nodes |
|---|
| 158 | as needed in order to control the BDD size. The threshold value for the BDD size can |
|---|
| 159 | be set by the parameter "partition_threshold". This method encompasses both "inout" |
|---|
| 160 | (set partition_threshold parameter to infinity) and |
|---|
| 161 | "total" (set partition_threshold parameter to 0). |
|---|
| 162 | |
|---|
| 163 | <li> <tt>boundary</tt> Builds a partition in a fashion that preserves all nodes that |
|---|
| 164 | are Input/Output nodes of any hnode in the hierarchy rooted at the current hnode. |
|---|
| 165 | |
|---|
| 166 | </dl> |
|---|
| 167 | |
|---|
| 168 | Command options: <p> |
|---|
| 169 | |
|---|
| 170 | <dl> |
|---|
| 171 | |
|---|
| 172 | <dt> -h |
|---|
| 173 | <dd> Print the command usage.<p> |
|---|
| 174 | |
|---|
| 175 | <dt> -i |
|---|
| 176 | <dd> Build the multi-valued functions of each partition vertex in terms of |
|---|
| 177 | the combinational inputs, rather than in terms of its transitive fanin |
|---|
| 178 | vertices.<p> |
|---|
| 179 | |
|---|
| 180 | <dt> -n <list> |
|---|
| 181 | <dd> Used in conjunction with the <tt>partial</tt> method. <tt>List</tt> is |
|---|
| 182 | a comma separated list of network nodes to use as intermediate nodes in the |
|---|
| 183 | partition.<p> |
|---|
| 184 | |
|---|
| 185 | <dt> -s <num> |
|---|
| 186 | <dd> Level of severity of a post-computation check applied to the partition data |
|---|
| 187 | structure (0 by default, meaning no check).<p> |
|---|
| 188 | |
|---|
| 189 | <dt> -t <seconds> |
|---|
| 190 | <dd> Time in seconds allowed to build the partition. If the computation time |
|---|
| 191 | goes above that limit, the process of building the partition is aborted. The |
|---|
| 192 | default is no limit.<p> |
|---|
| 193 | |
|---|
| 194 | <dt> -v |
|---|
| 195 | <dd> Turn on the verbosity.<p> |
|---|
| 196 | |
|---|
| 197 | </ul>] |
|---|
| 198 | |
|---|
| 199 | SideEffects [Registers in the network the partition application with |
|---|
| 200 | the key specified by PART_NETWORK_APPL_KEY] |
|---|
| 201 | |
|---|
| 202 | SeeAlso [Ntk_NetworkAddApplInfo] |
|---|
| 203 | |
|---|
| 204 | ******************************************************************************/ |
|---|
| 205 | static int |
|---|
| 206 | CommandBuildPartitionMdds( |
|---|
| 207 | Hrc_Manager_t ** hmgr, |
|---|
| 208 | int argc, |
|---|
| 209 | char ** argv) |
|---|
| 210 | { |
|---|
| 211 | static Part_PartitionMethod method; |
|---|
| 212 | static boolean inTermsOfLeaves; |
|---|
| 213 | lsList nodeList = lsCreate(); |
|---|
| 214 | graph_t *partition; |
|---|
| 215 | static int verbose; |
|---|
| 216 | static int sanityCheck; |
|---|
| 217 | static int timeOutPeriod; |
|---|
| 218 | int c; |
|---|
| 219 | int length; |
|---|
| 220 | char *methodString; |
|---|
| 221 | char *modelName; |
|---|
| 222 | Hrc_Node_t *currentNode; |
|---|
| 223 | Ntk_Network_t *network = Ntk_HrcManagerReadCurrentNetwork(*hmgr); |
|---|
| 224 | char *nodeName; |
|---|
| 225 | char *tmpNodeName; |
|---|
| 226 | char *realName; |
|---|
| 227 | FILE *nodeFile; |
|---|
| 228 | static boolean fileUsed; |
|---|
| 229 | |
|---|
| 230 | fileUsed = FALSE; |
|---|
| 231 | inTermsOfLeaves = FALSE; |
|---|
| 232 | verbose = 0; |
|---|
| 233 | sanityCheck = 0; |
|---|
| 234 | timeOutPeriod = 0; |
|---|
| 235 | |
|---|
| 236 | nodeFile = NIL(FILE); |
|---|
| 237 | util_getopt_reset(); |
|---|
| 238 | while ((c = util_getopt(argc, argv, "f:hvin:s:t:")) != EOF) { |
|---|
| 239 | switch(c) { |
|---|
| 240 | case 'f': |
|---|
| 241 | fileUsed = TRUE; |
|---|
| 242 | nodeFile = Cmd_FileOpen(util_optarg, "r", &realName, 1); |
|---|
| 243 | FREE(realName); |
|---|
| 244 | if (nodeFile == NIL(FILE)){ |
|---|
| 245 | (void)fprintf(vis_stderr,"Cannot open %s\n", util_optarg); |
|---|
| 246 | lsDestroy(nodeList, (void (*)(lsGeneric))0); |
|---|
| 247 | return 1; |
|---|
| 248 | } |
|---|
| 249 | else{ |
|---|
| 250 | tmpNodeName = ALLOC(char, 512); |
|---|
| 251 | while(fscanf(nodeFile, "%s\n", tmpNodeName) != EOF){ |
|---|
| 252 | if(*tmpNodeName != '#'){ |
|---|
| 253 | nodeName = ALLOC(char, strlen(tmpNodeName) + 2); |
|---|
| 254 | sprintf(nodeName, "%s", tmpNodeName); |
|---|
| 255 | lsNewEnd(nodeList, (lsGeneric)nodeName, NIL(lsHandle)); |
|---|
| 256 | } |
|---|
| 257 | } |
|---|
| 258 | FREE(tmpNodeName); |
|---|
| 259 | } |
|---|
| 260 | break; |
|---|
| 261 | case 'h': |
|---|
| 262 | goto usage; |
|---|
| 263 | case 'i': |
|---|
| 264 | inTermsOfLeaves = TRUE; |
|---|
| 265 | break; |
|---|
| 266 | case 'v': |
|---|
| 267 | verbose = 1; |
|---|
| 268 | break; |
|---|
| 269 | case 's': |
|---|
| 270 | sanityCheck = atoi(util_optarg); |
|---|
| 271 | break; |
|---|
| 272 | case 't': |
|---|
| 273 | timeOutPeriod = atoi(util_optarg); |
|---|
| 274 | break; |
|---|
| 275 | case 'n': |
|---|
| 276 | length = strlen(util_optarg); |
|---|
| 277 | for(c = 0; c < length; c++) { |
|---|
| 278 | if (util_optarg[c] == ',') { |
|---|
| 279 | util_optarg[c] = 0; |
|---|
| 280 | } /* End of if */ |
|---|
| 281 | } /* End of for */ |
|---|
| 282 | c = 0; |
|---|
| 283 | while (c < length) { |
|---|
| 284 | lsNewEnd(nodeList, &util_optarg[c], NIL(lsHandle)); |
|---|
| 285 | while (util_optarg[c++] != 0); |
|---|
| 286 | } /* End of while */ |
|---|
| 287 | break; |
|---|
| 288 | default: |
|---|
| 289 | goto usage; |
|---|
| 290 | } |
|---|
| 291 | } |
|---|
| 292 | |
|---|
| 293 | if (argc == util_optind) { |
|---|
| 294 | /* No method specified. Choosing default */ |
|---|
| 295 | methodString = Cmd_FlagReadByName("partition_method"); |
|---|
| 296 | if (methodString == NIL(char)) { |
|---|
| 297 | methodString = "default"; |
|---|
| 298 | } |
|---|
| 299 | } |
|---|
| 300 | else { |
|---|
| 301 | methodString = argv[util_optind]; |
|---|
| 302 | } |
|---|
| 303 | |
|---|
| 304 | if (strcmp(methodString,"inout") == 0) { |
|---|
| 305 | method = Part_InOut_c; |
|---|
| 306 | if (lsLength(nodeList) != 0) { |
|---|
| 307 | (void) fprintf(vis_stderr, "Ignoring provided list of nodes in <inout>"); |
|---|
| 308 | (void) fprintf(vis_stderr, " method\n"); |
|---|
| 309 | } /* End of if */ |
|---|
| 310 | if (inTermsOfLeaves) { |
|---|
| 311 | (void) fprintf(vis_stderr, "Ignoring -i flag in the <inout> method\n"); |
|---|
| 312 | } /* End of if */ |
|---|
| 313 | } |
|---|
| 314 | else if (strcmp(methodString,"partial") == 0) { |
|---|
| 315 | method = Part_Partial_c; |
|---|
| 316 | /* Make sure a list of nodes has been provided */ |
|---|
| 317 | if (lsLength(nodeList) == 0) { |
|---|
| 318 | (void) fprintf(vis_stderr, "Method <partial> requires a non-empty list"); |
|---|
| 319 | (void) fprintf(vis_stderr, " of nodes\n"); |
|---|
| 320 | |
|---|
| 321 | lsDestroy(nodeList, (void (*)(lsGeneric))0); |
|---|
| 322 | goto usage; |
|---|
| 323 | } /* End of if */ |
|---|
| 324 | } |
|---|
| 325 | else if (strcmp(methodString,"total") == 0) { |
|---|
| 326 | method = Part_Total_c; |
|---|
| 327 | if (lsLength(nodeList) != 0) { |
|---|
| 328 | (void) fprintf(vis_stderr, "Ignoring provided list of nodes in <total>"); |
|---|
| 329 | (void) fprintf(vis_stderr, " method\n"); |
|---|
| 330 | } /* End of if */ |
|---|
| 331 | } |
|---|
| 332 | else if (strcmp(methodString,"frontier") == 0) { |
|---|
| 333 | method = Part_Frontier_c; |
|---|
| 334 | } |
|---|
| 335 | else if (strcmp(methodString,"boundary") == 0) { |
|---|
| 336 | method = Part_Boundary_c; |
|---|
| 337 | } |
|---|
| 338 | else if (strcmp(methodString, "fine") == 0) { |
|---|
| 339 | method = Part_Fine_c; |
|---|
| 340 | } |
|---|
| 341 | else if (strcmp(methodString, "default") == 0) { |
|---|
| 342 | method = Part_Default_c; |
|---|
| 343 | } |
|---|
| 344 | else { |
|---|
| 345 | goto usage; |
|---|
| 346 | } |
|---|
| 347 | |
|---|
| 348 | |
|---|
| 349 | /* Check if the network has been read in */ |
|---|
| 350 | if (network == NIL(Ntk_Network_t)) { |
|---|
| 351 | lsDestroy(nodeList, (void (*)(lsGeneric))0); |
|---|
| 352 | return 1; |
|---|
| 353 | } |
|---|
| 354 | |
|---|
| 355 | /* Check if the network has the variables ordered */ |
|---|
| 356 | if (Ord_NetworkTestAreVariablesOrdered(network, Ord_InputAndLatch_c) == |
|---|
| 357 | FALSE) { |
|---|
| 358 | (void) fprintf(vis_stdout, "The MDD variables have not been ordered. Use static_order.\n"); |
|---|
| 359 | |
|---|
| 360 | lsDestroy(nodeList, (void (*)(lsGeneric))0); |
|---|
| 361 | return 1; |
|---|
| 362 | } |
|---|
| 363 | |
|---|
| 364 | /* Check if there is already a partition attached to the network */ |
|---|
| 365 | partition = (graph_t *) Ntk_NetworkReadApplInfo(network, |
|---|
| 366 | PART_NETWORK_APPL_KEY); |
|---|
| 367 | |
|---|
| 368 | /* If there is, just return. */ |
|---|
| 369 | if (partition != NIL(graph_t)) { |
|---|
| 370 | (void) fprintf(vis_stderr, "partition already built; reinvoke "); |
|---|
| 371 | (void) fprintf(vis_stderr, "flatten_hierarchy to remove the current partition\n"); |
|---|
| 372 | return 1; |
|---|
| 373 | } |
|---|
| 374 | |
|---|
| 375 | /* Read the name of the model to be passed to Part_NetworkCreatePartition */ |
|---|
| 376 | currentNode = Hrc_ManagerReadCurrentNode(*hmgr); |
|---|
| 377 | modelName = Hrc_NodeReadModelName(currentNode); |
|---|
| 378 | |
|---|
| 379 | /* Set the timeout */ |
|---|
| 380 | if (timeOutPeriod > 0) { |
|---|
| 381 | (void) signal(SIGALRM, (void(*)(int))TimeOutHandle); |
|---|
| 382 | (void) alarm(timeOutPeriod); |
|---|
| 383 | if (setjmp(timeOutEnv) > 0) { |
|---|
| 384 | (void) fprintf(vis_stdout, "Partition: timeout occurred after "); |
|---|
| 385 | (void) fprintf(vis_stdout, "%d seconds\n", timeOutPeriod); |
|---|
| 386 | alarm(0); |
|---|
| 387 | |
|---|
| 388 | /* Partial clean up */ |
|---|
| 389 | lsDestroy(nodeList, (void (*)(lsGeneric))0); |
|---|
| 390 | return 1; |
|---|
| 391 | } |
|---|
| 392 | } |
|---|
| 393 | |
|---|
| 394 | /* |
|---|
| 395 | * Execute the partition algorithm. The two nil pointers is to indicate |
|---|
| 396 | * that the graph must represent the complete network. |
|---|
| 397 | */ |
|---|
| 398 | partition = Part_NetworkCreatePartition(network, currentNode, modelName, (lsList)0, |
|---|
| 399 | (lsList)0, NIL(mdd_t), method, nodeList, |
|---|
| 400 | inTermsOfLeaves, verbose, |
|---|
| 401 | sanityCheck); |
|---|
| 402 | |
|---|
| 403 | /* Register the partition in the network if any */ |
|---|
| 404 | Ntk_NetworkAddApplInfo(network, PART_NETWORK_APPL_KEY, |
|---|
| 405 | (Ntk_ApplInfoFreeFn) Part_PartitionFreeCallback, |
|---|
| 406 | (void *) partition); |
|---|
| 407 | |
|---|
| 408 | /* Deactivate the alarm */ |
|---|
| 409 | alarm(0); |
|---|
| 410 | |
|---|
| 411 | /* Clean up */ |
|---|
| 412 | if(fileUsed){ |
|---|
| 413 | lsDestroy(nodeList, PartNameFree); |
|---|
| 414 | } |
|---|
| 415 | else{ |
|---|
| 416 | lsDestroy(nodeList, (void (*)(lsGeneric))0); |
|---|
| 417 | } |
|---|
| 418 | return 0; |
|---|
| 419 | |
|---|
| 420 | usage: |
|---|
| 421 | (void) fprintf(vis_stderr, "usage: build_partition_mdds [options] [method]\n"); |
|---|
| 422 | (void) fprintf(vis_stderr, "Options:\n"); |
|---|
| 423 | (void) fprintf(vis_stderr, " -h\t\tprint the command usage\n"); |
|---|
| 424 | (void) fprintf(vis_stderr, " -i\t\tBuild the functions in the partition in terms of the\n"); |
|---|
| 425 | (void) fprintf(vis_stderr, " \t\tcombinational inputs of the system. This option is redundant if\n"); |
|---|
| 426 | (void) fprintf(vis_stderr, " \t\tthe inout partition is chosen.\n"); |
|---|
| 427 | (void) fprintf(vis_stderr, " -n <list>\tComma separated list of network nodes to preserve in the\n"); |
|---|
| 428 | (void) fprintf(vis_stderr, " \tpartitioning. It only matters if the partial method has been\n"); |
|---|
| 429 | (void) fprintf(vis_stderr, " \tselected.\n"); |
|---|
| 430 | (void) fprintf(vis_stderr, " -f <file>\tSpecifies the file containing names of network nodes\n"); |
|---|
| 431 | (void) fprintf(vis_stderr, " \tto preserve while partitioning. This option matters only \n"); |
|---|
| 432 | (void) fprintf(vis_stderr, " \tif the partial method has been selected. Each node name must\n"); |
|---|
| 433 | (void) fprintf(vis_stderr, " \tbe listed on a new line. Comments in <file> must begin with '#'.\n"); |
|---|
| 434 | (void) fprintf(vis_stderr, " -s <num>\tLevel of severity check applied after computation. 0 being no\n"); |
|---|
| 435 | (void) fprintf(vis_stderr, " \t\tcheck, 1 begin simple check and >1 being exhaustive check.\n"); |
|---|
| 436 | (void) fprintf(vis_stderr, " -t <sec>\tTime in seconds allowed to build the partition. If the\n"); |
|---|
| 437 | (void) fprintf(vis_stderr, " \tcomputation time goes above that limit, the process of building\n"); |
|---|
| 438 | (void) fprintf(vis_stderr, " \tthe partition is aborted.\n"); |
|---|
| 439 | (void) fprintf(vis_stderr, " -v\t\tverbose\n"); |
|---|
| 440 | (void) fprintf(vis_stderr, "Methods\n"); |
|---|
| 441 | (void) fprintf(vis_stderr, " inout\tIt represents the network with one MDD for\n"); |
|---|
| 442 | (void) fprintf(vis_stderr, " \teach combinational output as a function of the combinational\n"); |
|---|
| 443 | (void) fprintf(vis_stderr, " \tinputs\n"); |
|---|
| 444 | (void) fprintf(vis_stderr, " total\tPartitions the network preserving its structure. Every node in\n"); |
|---|
| 445 | (void) fprintf(vis_stderr, " \tthe network will produce a vertex in the partition graph. The\n"); |
|---|
| 446 | (void) fprintf(vis_stderr, " \tflag -i explained above controls the support of\n"); |
|---|
| 447 | (void) fprintf(vis_stderr, " \tthe functions attached to the vertices.\n"); |
|---|
| 448 | (void) fprintf(vis_stderr, " frontier\tThe default method. Partitions the network creating vertices for intermediate nodes\n"); |
|---|
| 449 | (void) fprintf(vis_stderr, " \tas necessary to control the BDD size. The threshold value of the\n"); |
|---|
| 450 | (void) fprintf(vis_stderr, " \tBDD can be specified by partition_threshold.\n"); |
|---|
| 451 | (void) fprintf(vis_stderr, " partial\tPartitions the network preserving certain nodes specified with\n"); |
|---|
| 452 | (void) fprintf(vis_stderr, " \tthe option -n or -f.\n"); |
|---|
| 453 | (void) fprintf(vis_stderr, " boundary\tPartitions the network preserving all nodes that are \n"); |
|---|
| 454 | (void) fprintf(vis_stderr, " \tsubcircuit IOs.\n"); |
|---|
| 455 | |
|---|
| 456 | lsDestroy(nodeList, (void (*)(lsGeneric))0); |
|---|
| 457 | |
|---|
| 458 | return 1; /* Error exit */ |
|---|
| 459 | } /* End of CommandBuildPartitionMdds */ |
|---|
| 460 | |
|---|
| 461 | |
|---|
| 462 | /**Function******************************************************************** |
|---|
| 463 | |
|---|
| 464 | Synopsis [This frees a given char *] |
|---|
| 465 | |
|---|
| 466 | Description [This function frees the memory assocated with a char * that |
|---|
| 467 | is given as input] |
|---|
| 468 | |
|---|
| 469 | SideEffects [ ] |
|---|
| 470 | |
|---|
| 471 | SeeAlso [] |
|---|
| 472 | |
|---|
| 473 | ******************************************************************************/ |
|---|
| 474 | void |
|---|
| 475 | PartNameFree( |
|---|
| 476 | lsGeneric name) |
|---|
| 477 | { |
|---|
| 478 | FREE(name); |
|---|
| 479 | } |
|---|
| 480 | |
|---|
| 481 | |
|---|
| 482 | /**Function******************************************************************** |
|---|
| 483 | |
|---|
| 484 | Synopsis [Command level routine to write a file in dot format of the |
|---|
| 485 | partition DAG.] |
|---|
| 486 | |
|---|
| 487 | SideEffects [] |
|---|
| 488 | |
|---|
| 489 | SeeAlso [CommandBuildPartitionMdds] |
|---|
| 490 | |
|---|
| 491 | CommandName [print_partition] |
|---|
| 492 | |
|---|
| 493 | CommandSynopsis [print the "dot" format describing the partition graph] |
|---|
| 494 | |
|---|
| 495 | CommandArguments [\[-h\] <file>] |
|---|
| 496 | |
|---|
| 497 | CommandDescription [Write a file in the format taken by the tool |
|---|
| 498 | <tt>dot</tt>. Dot is a tool that, given a description of a graph in a |
|---|
| 499 | certain format, produces a postscript print of the graph. For more |
|---|
| 500 | information about <tt>dot</tt> look in <a |
|---|
| 501 | href="http://www.research.att.com/sw/tools/graphviz"> |
|---|
| 502 | http://www.research.att.com/sw/tools/graphviz</a>.<p> |
|---|
| 503 | |
|---|
| 504 | If no argument is specified on the command line, the output is written to |
|---|
| 505 | the standard output.<p> |
|---|
| 506 | |
|---|
| 507 | Command options:<p> |
|---|
| 508 | <dl> |
|---|
| 509 | |
|---|
| 510 | <dt> -h |
|---|
| 511 | <dd> Print the command usage.<p> |
|---|
| 512 | |
|---|
| 513 | <dt> <file> |
|---|
| 514 | <dd> Name of file where the partition is to be written in "dot" format. |
|---|
| 515 | |
|---|
| 516 | </dl>] |
|---|
| 517 | |
|---|
| 518 | ******************************************************************************/ |
|---|
| 519 | static int |
|---|
| 520 | CommandPrintPartition( |
|---|
| 521 | Hrc_Manager_t **hmgr, |
|---|
| 522 | int argc, |
|---|
| 523 | char **argv) |
|---|
| 524 | { |
|---|
| 525 | FILE *fp; |
|---|
| 526 | int c, status; |
|---|
| 527 | graph_t *partition; |
|---|
| 528 | Ntk_Network_t *network = Ntk_HrcManagerReadCurrentNetwork(*hmgr); |
|---|
| 529 | |
|---|
| 530 | util_getopt_reset(); |
|---|
| 531 | while ((c = util_getopt(argc,argv,"h")) != EOF){ |
|---|
| 532 | switch(c){ |
|---|
| 533 | case 'h': |
|---|
| 534 | goto usage; |
|---|
| 535 | default: |
|---|
| 536 | goto usage; |
|---|
| 537 | } |
|---|
| 538 | } |
|---|
| 539 | |
|---|
| 540 | /* Check if the network has been read in */ |
|---|
| 541 | if (network == NIL(Ntk_Network_t)) { |
|---|
| 542 | return 1; |
|---|
| 543 | } |
|---|
| 544 | |
|---|
| 545 | /* Check if there is a partition attached to the network */ |
|---|
| 546 | partition = (graph_t *) Ntk_NetworkReadApplInfo(network, |
|---|
| 547 | PART_NETWORK_APPL_KEY); |
|---|
| 548 | if (partition == NIL(graph_t)) { |
|---|
| 549 | (void) fprintf(vis_stderr, "No partition has been created for this network.\n"); |
|---|
| 550 | return 1; |
|---|
| 551 | } |
|---|
| 552 | |
|---|
| 553 | if (argc == 1) { |
|---|
| 554 | fp = vis_stdout; |
|---|
| 555 | } |
|---|
| 556 | else if (argc == 2) { |
|---|
| 557 | fp = Cmd_FileOpen(*(++argv), "w", NIL(char *), /* silent */ 1); |
|---|
| 558 | if (fp == NIL(FILE)) { |
|---|
| 559 | (void) fprintf(vis_stderr, "Cannot write to %s\n", *argv); |
|---|
| 560 | return 1; |
|---|
| 561 | } |
|---|
| 562 | } |
|---|
| 563 | else { |
|---|
| 564 | goto usage; |
|---|
| 565 | } |
|---|
| 566 | |
|---|
| 567 | error_init(); |
|---|
| 568 | status = PartPartitionPrint(fp, partition); |
|---|
| 569 | (void) fprintf(vis_stderr, "%s", error_string()); |
|---|
| 570 | fflush(fp); |
|---|
| 571 | |
|---|
| 572 | /* If we opened a file before, close it */ |
|---|
| 573 | if (argc == 2) { |
|---|
| 574 | (void) fclose(fp); |
|---|
| 575 | } |
|---|
| 576 | return (status ? 0 : 1); |
|---|
| 577 | |
|---|
| 578 | usage: |
|---|
| 579 | (void) fprintf(vis_stderr, "usage: print_partition [-h] [file]\n"); |
|---|
| 580 | (void) fprintf(vis_stderr, " -h\t\tprint the command usage\n"); |
|---|
| 581 | return 1; |
|---|
| 582 | } /* End of CommandPrintPartition */ |
|---|
| 583 | |
|---|
| 584 | /**Function******************************************************************** |
|---|
| 585 | |
|---|
| 586 | Synopsis [Command level routine to print some stats of the partition DAG.] |
|---|
| 587 | |
|---|
| 588 | SideEffects [] |
|---|
| 589 | |
|---|
| 590 | SeeAlso [CommandBuildPartitionMdds] |
|---|
| 591 | |
|---|
| 592 | CommandName [print_partition_stats] |
|---|
| 593 | |
|---|
| 594 | CommandSynopsis [print statistics about the partition graph] |
|---|
| 595 | |
|---|
| 596 | CommandArguments [\[-h\] \[-n\]] |
|---|
| 597 | |
|---|
| 598 | CommandDescription [Print statistics about the partition currently attached |
|---|
| 599 | to the network, such as: |
|---|
| 600 | |
|---|
| 601 | <dl> |
|---|
| 602 | <li>Method used to build the partition. |
|---|
| 603 | <li>Number of sink vertices. |
|---|
| 604 | <li>Number of source vertices. |
|---|
| 605 | <li>Total number of vertices. |
|---|
| 606 | <li>Number of shared MDD nodes used to represent the functions. |
|---|
| 607 | </dl> |
|---|
| 608 | |
|---|
| 609 | Command options:<p> |
|---|
| 610 | |
|---|
| 611 | <dl> |
|---|
| 612 | |
|---|
| 613 | <dt> -h |
|---|
| 614 | <dd> Print the command usage.<p> |
|---|
| 615 | |
|---|
| 616 | <dt> -n |
|---|
| 617 | <dd> Print the name of the network nodes represented by vertices in the |
|---|
| 618 | partition. |
|---|
| 619 | |
|---|
| 620 | </dl>] |
|---|
| 621 | |
|---|
| 622 | ******************************************************************************/ |
|---|
| 623 | static int |
|---|
| 624 | CommandPrintPartitionStats( |
|---|
| 625 | Hrc_Manager_t **hmgr, |
|---|
| 626 | int argc, |
|---|
| 627 | char **argv) |
|---|
| 628 | { |
|---|
| 629 | int c; |
|---|
| 630 | graph_t *partition; |
|---|
| 631 | Ntk_Network_t *network = Ntk_HrcManagerReadCurrentNetwork(*hmgr); |
|---|
| 632 | boolean printNodeNames = FALSE; |
|---|
| 633 | |
|---|
| 634 | util_getopt_reset(); |
|---|
| 635 | while ((c = util_getopt(argc,argv,"hn")) != EOF){ |
|---|
| 636 | switch(c){ |
|---|
| 637 | case 'n': |
|---|
| 638 | printNodeNames = TRUE; |
|---|
| 639 | break; |
|---|
| 640 | case 'h': |
|---|
| 641 | goto usage; |
|---|
| 642 | default: |
|---|
| 643 | goto usage; |
|---|
| 644 | } |
|---|
| 645 | } |
|---|
| 646 | |
|---|
| 647 | /* Check if the network has been read in */ |
|---|
| 648 | if (network == NIL(Ntk_Network_t)) { |
|---|
| 649 | return 1; |
|---|
| 650 | } |
|---|
| 651 | |
|---|
| 652 | /* Check if there is a partition attached to the network */ |
|---|
| 653 | partition = (graph_t *) Ntk_NetworkReadApplInfo(network, |
|---|
| 654 | PART_NETWORK_APPL_KEY); |
|---|
| 655 | if (partition == NIL(graph_t)) { |
|---|
| 656 | (void) fprintf(vis_stderr, "No partition has been created for this network.\n"); |
|---|
| 657 | return 1; |
|---|
| 658 | } |
|---|
| 659 | |
|---|
| 660 | /* Print the statistics to vis_stdout */ |
|---|
| 661 | Part_PartitionPrintStats(vis_stdout, partition, printNodeNames); |
|---|
| 662 | return 0; |
|---|
| 663 | |
|---|
| 664 | usage: |
|---|
| 665 | (void) fprintf(vis_stderr, "usage: print_partition_stats [-h] [-n]\n"); |
|---|
| 666 | (void) fprintf(vis_stderr, " -h\t\tprint the command usage\n"); |
|---|
| 667 | (void) fprintf(vis_stderr, " -n\t\tprint names of network nodes "); |
|---|
| 668 | (void) fprintf(vis_stderr, "represented by vertices\n"); |
|---|
| 669 | return 1; |
|---|
| 670 | } /* End of CommandPrintPartitionStats */ |
|---|
| 671 | |
|---|
| 672 | |
|---|
| 673 | /**Function******************************************************************** |
|---|
| 674 | |
|---|
| 675 | Synopsis [required] |
|---|
| 676 | |
|---|
| 677 | Description [optional] |
|---|
| 678 | |
|---|
| 679 | SideEffects [required] |
|---|
| 680 | |
|---|
| 681 | SeeAlso [optional] |
|---|
| 682 | |
|---|
| 683 | ******************************************************************************/ |
|---|
| 684 | static void |
|---|
| 685 | TimeOutHandle(void) |
|---|
| 686 | { |
|---|
| 687 | longjmp(timeOutEnv, 1); |
|---|
| 688 | } /* End of TimeOutHandle */ |
|---|