1 | /**CFile*********************************************************************** |
---|
2 | |
---|
3 | FileName [fsmCmd.c] |
---|
4 | |
---|
5 | PackageName [fsm] |
---|
6 | |
---|
7 | Synopsis [Commands for the FSM package.] |
---|
8 | |
---|
9 | Author [Shaker Sarwary, Tom Shiple, Rajeev Ranjan, In-Ho Moon, Kavita Ravi] |
---|
10 | |
---|
11 | Copyright [Copyright (c) 1994-1996 The Regents of the Univ. of California. |
---|
12 | All rights reserved. |
---|
13 | |
---|
14 | Permission is hereby granted, without written agreement and without license |
---|
15 | or royalty fees, to use, copy, modify, and distribute this software and its |
---|
16 | documentation for any purpose, provided that the above copyright notice and |
---|
17 | the following two paragraphs appear in all copies of this software. |
---|
18 | |
---|
19 | IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR |
---|
20 | DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT |
---|
21 | OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF |
---|
22 | CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
23 | |
---|
24 | THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, |
---|
25 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
---|
26 | FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN |
---|
27 | "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE |
---|
28 | MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.] |
---|
29 | |
---|
30 | ******************************************************************************/ |
---|
31 | |
---|
32 | #include "fsmInt.h" |
---|
33 | |
---|
34 | static char rcsid[] UNUSED = "$Id: fsmCmd.c,v 1.122 2005/05/19 03:21:37 awedh Exp $"; |
---|
35 | |
---|
36 | /*---------------------------------------------------------------------------*/ |
---|
37 | /* Variable declarations */ |
---|
38 | /*---------------------------------------------------------------------------*/ |
---|
39 | static jmp_buf timeOutEnv; |
---|
40 | |
---|
41 | /**AutomaticStart*************************************************************/ |
---|
42 | |
---|
43 | /*---------------------------------------------------------------------------*/ |
---|
44 | /* Static function prototypes */ |
---|
45 | /*---------------------------------------------------------------------------*/ |
---|
46 | |
---|
47 | static int CommandComputeReach(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
48 | static int CommandReadFairness(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
49 | static int CommandResetFairness(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
50 | static int CommandPrintFairness(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
51 | static int CommandPrintImageInfo(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
52 | static int CommandPrintHdOptions(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
53 | static int CommandPrintArdcOptions(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
54 | static int CommandPrintTfmOptions(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
55 | static int CommandPrintHybridOptions(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
56 | static int CommandPrintMlpOptions(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
57 | static int CommandPrintGuidedSearchOptions(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
58 | static void TimeOutHandle(void); |
---|
59 | |
---|
60 | /**AutomaticEnd***************************************************************/ |
---|
61 | |
---|
62 | |
---|
63 | /*---------------------------------------------------------------------------*/ |
---|
64 | /* Definition of exported functions */ |
---|
65 | /*---------------------------------------------------------------------------*/ |
---|
66 | |
---|
67 | /**Function******************************************************************** |
---|
68 | |
---|
69 | Synopsis [Initializes the FSM package.] |
---|
70 | |
---|
71 | SideEffects [] |
---|
72 | |
---|
73 | SeeAlso [Fsm_End] |
---|
74 | |
---|
75 | ******************************************************************************/ |
---|
76 | void |
---|
77 | Fsm_Init(void) |
---|
78 | { |
---|
79 | Cmd_CommandAdd("compute_reach", CommandComputeReach, 0); |
---|
80 | Cmd_CommandAdd("read_fairness", CommandReadFairness, 0); |
---|
81 | Cmd_CommandAdd("reset_fairness", CommandResetFairness, 0); |
---|
82 | Cmd_CommandAdd("print_fairness", CommandPrintFairness, 0); |
---|
83 | Cmd_CommandAdd("print_img_info", CommandPrintImageInfo, 0); |
---|
84 | Cmd_CommandAdd("print_hd_options", CommandPrintHdOptions, 0); |
---|
85 | Cmd_CommandAdd("print_guided_search_options", CommandPrintGuidedSearchOptions, 0); |
---|
86 | Cmd_CommandAdd("print_ardc_options", CommandPrintArdcOptions, 0); |
---|
87 | Cmd_CommandAdd("print_tfm_options", CommandPrintTfmOptions, 0); |
---|
88 | Cmd_CommandAdd("print_hybrid_options", CommandPrintHybridOptions, 0); |
---|
89 | Cmd_CommandAdd("print_mlp_options", CommandPrintMlpOptions, 0); |
---|
90 | } |
---|
91 | |
---|
92 | |
---|
93 | /**Function******************************************************************** |
---|
94 | |
---|
95 | Synopsis [Ends the FSM package.] |
---|
96 | |
---|
97 | SideEffects [] |
---|
98 | |
---|
99 | SeeAlso [Fsm_Init] |
---|
100 | |
---|
101 | ******************************************************************************/ |
---|
102 | void |
---|
103 | Fsm_End(void) |
---|
104 | { |
---|
105 | } |
---|
106 | |
---|
107 | /*---------------------------------------------------------------------------*/ |
---|
108 | /* Definition of internal functions */ |
---|
109 | /*---------------------------------------------------------------------------*/ |
---|
110 | |
---|
111 | |
---|
112 | /*---------------------------------------------------------------------------*/ |
---|
113 | /* Definition of static functions */ |
---|
114 | /*---------------------------------------------------------------------------*/ |
---|
115 | |
---|
116 | /**Function******************************************************************** |
---|
117 | |
---|
118 | Synopsis [Implements the compute_reach command.] |
---|
119 | |
---|
120 | Description [If no network or FSM exists, does nothing. Otherwise, the set |
---|
121 | of reachablestates is calculated by computing least fixed point of the |
---|
122 | initial states under the next state functions of the FSM. The option [-v n] |
---|
123 | specifies the verbosity level. If n is greater than 0, summary information |
---|
124 | is printed. If n is greater than 1, intermediate information is printed.] |
---|
125 | |
---|
126 | CommandName [compute_reach] |
---|
127 | |
---|
128 | CommandSynopsis [compute the set of reachable states of the FSM] |
---|
129 | |
---|
130 | CommandArguments [\[-d <depthValue>\] \[-f\] \[-g <file>\] \[-h\] \[-i\] \[-r <thresholdValue>\] \[-s <printStep>\] \[-t <timeOut>\] \[-v #\] \[-A #\] \[-D\] \[-F\]] |
---|
131 | |
---|
132 | CommandDescription [Compute the set of reachable states of the FSM |
---|
133 | associated with the flattened network. The command |
---|
134 | <tt>build_partition_mdds</tt> (or <tt>init_verify</tt>) must have |
---|
135 | already been invoked on the flattened network, before this command |
---|
136 | is called. On subsequent calls to compute_reach, the reachable |
---|
137 | states will not be recomputed, but statistics can be printed using |
---|
138 | -v. To force recomputation with a different set of options, for |
---|
139 | example a depth value with -d, use -F option. <p> |
---|
140 | |
---|
141 | The method used for image computation is displayed by the option |
---|
142 | <tt>-v 1</tt>. To change the image computation method, use the |
---|
143 | command <tt>set image_method</tt>, and then start again with the |
---|
144 | command <tt>flatten_hierarchy</tt>. The reachability computation |
---|
145 | makes extensive use of image computation. There are several |
---|
146 | user-settable options that can be used to affect the performance of |
---|
147 | image computation. See the documentation for the <tt>set</tt> |
---|
148 | command for these options.<p> |
---|
149 | |
---|
150 | Command options:<p> |
---|
151 | |
---|
152 | <dl> |
---|
153 | |
---|
154 | <dt> -d <depthValue> |
---|
155 | <dd> Perform reachability for depthValue steps only - this option |
---|
156 | specifies the number of unit operations (image computations) to be |
---|
157 | performed in the reachability computation. The depthValue used in |
---|
158 | successive calls proceeds from the previous state. For example, |
---|
159 | compute_reach -d 3; compute_reach -d 4; will perform 7 steps of |
---|
160 | reachability in total, the second call to compute_reach proceeding |
---|
161 | from the result of the first. While using only -A 0 option |
---|
162 | (default), this additionally corresponds to the depth in the state |
---|
163 | graph, starting from the initial state. For the -A 1 option, the |
---|
164 | above may not be true. This option is not compatible with -A 2. <p> |
---|
165 | |
---|
166 | <dt> -f |
---|
167 | <dd> Store the set of new states (onion rings) reached at each step |
---|
168 | of reachability. If this flag is specified, then the computation |
---|
169 | proceeds with the previously set of onion rings, if any exist (not |
---|
170 | any prior computation without onion rings). This option is likely to |
---|
171 | use more memory during reachability analysis. This is not compatible |
---|
172 | with -A 2. <p> |
---|
173 | |
---|
174 | <dt> -g <<code>hints_file</code>> <dd> Use guided search. The |
---|
175 | file <code>hints_file</code> contains a series of hints. A hint is |
---|
176 | a formula that does not contain any temporal operators, so |
---|
177 | <code>hints_file</code> has the same syntax as a file of invariants |
---|
178 | used for check_invariant. The hints are used in the order given to |
---|
179 | change the transition relation. The transition relation is |
---|
180 | conjoined with the hint to yield an underapproximation of the |
---|
181 | transition relation. If the hints are cleverly chosen, this may |
---|
182 | speed up the computation considerably, because a search with the |
---|
183 | changed transition relation may be much simpler than one with the |
---|
184 | original transition relation, and results obtained can be reused, so |
---|
185 | that we may never have to do an expensive search with the original |
---|
186 | relation. See also: Ravi and Somenzi, Hints to accelerate symbolic |
---|
187 | traversal. CHARME'99; Bloem, Ravi, and Somenzi, Efficient Decision |
---|
188 | Procedures for Model Checking of Linear Time Logic Properties, |
---|
189 | CAV'99; Bloem, Ravi, and Somenzi, Symbolic Guided Search for CTL |
---|
190 | Model Checking, DAC'00. Not allowed with -A 2 or -i, and will only |
---|
191 | work with iwls95 or monolithic image methods. The description of |
---|
192 | some options for guided search can be found in the help page for |
---|
193 | print_guided_search_options. <p> |
---|
194 | |
---|
195 | <dt> -h |
---|
196 | <dd> Print the command usage.<p> |
---|
197 | |
---|
198 | <dt> -i <dd> This option is useful when it's not possible to build the |
---|
199 | complete transition relation. Using this option, the transition relation is |
---|
200 | rebuilt at every itereation using the current reached set of states as the |
---|
201 | care set. This option is not compatible with the -A > 0 options, the -D |
---|
202 | option and the -g option.<p> |
---|
203 | |
---|
204 | <dt> -r <thresholdValue> |
---|
205 | <dd> Dynamic reordering (with method sift) is invoked once when the size |
---|
206 | of the reachable state set reaches the threshold value.<p> |
---|
207 | |
---|
208 | <dt> -s <printStep> |
---|
209 | <dd> At every printStep of the reachability computation, print the total |
---|
210 | number of states reached thus far, and the size of the MDD representing this |
---|
211 | set.<p> |
---|
212 | |
---|
213 | <dt> -t <timeOut> |
---|
214 | <dd> Time allowed to perform reachability (in seconds). Default is infinity.<p> |
---|
215 | |
---|
216 | <dt> -v # |
---|
217 | <dd> Print debug information. |
---|
218 | <dd> |
---|
219 | 0: (default) Nothing is printed out.<p> |
---|
220 | |
---|
221 | 1: Print a summary of reachability analysis and some information |
---|
222 | about the image computation method (see <tt>print_img_info</tt>) and |
---|
223 | summarizes results of reachability: |
---|
224 | |
---|
225 | <dd> |
---|
226 | <dd> <b>FSM depth:</b> the farthest reachable state |
---|
227 | <dd> <b>reachable states:</b> the number of reachable states |
---|
228 | <dd> <b>MDD size:</b> the size of the MDD representing the reachable states |
---|
229 | <dd> <b>analysis time:</b> number of CPU seconds taken to compute the |
---|
230 | reachable states<p> |
---|
231 | |
---|
232 | 2: Prints the detailed information about reachability analysis. For |
---|
233 | each <tt> printStep</tt>, it prints the MDD size of the reachable |
---|
234 | state set and the number of states in the set. <p> |
---|
235 | |
---|
236 | <dt> -A # |
---|
237 | <dd> This option allows specification of approximate reachability |
---|
238 | computation. <p> |
---|
239 | |
---|
240 | 0: (default) Breadth First Search. No approximate reachability |
---|
241 | computation. <p> |
---|
242 | |
---|
243 | 1: High Density Reachability Analysis (HD). Computes reachable states in a |
---|
244 | manner that keeps BDD sizes under control. May be faster than BFS in some |
---|
245 | cases. For larger circuits, this option should compute more reachable |
---|
246 | states. For help on controlling options for HD, look up help on the command: |
---|
247 | print_hd_options <A HREF="print_hd_optionsCmd.html"> |
---|
248 | <code>print_hd_options</code></A>. Refer to Ravi and Somenzi, ICCAD95. This |
---|
249 | option is available only when VIS is linked with the CUDD package. <p> |
---|
250 | |
---|
251 | 2. Approximate Reachability Don't Cares(ARDC). Computes over-approximate |
---|
252 | reachable states. For help on controlling options for ARDC, look up help on |
---|
253 | the command: print_ardc_options <A HREF="print_ardc_optionsCmd.html"> |
---|
254 | <code>print_ardc_options</code></A>. Refer Moon's paper, ICCAD98 and 2 |
---|
255 | papers by Cho et al, December TCAD96: one is for State Space Decomposition |
---|
256 | and the other is for Approximate FSM Traversal. The options -d, -g and -f are |
---|
257 | not compatible with this option. <p> |
---|
258 | |
---|
259 | <dt> -D <dd> First compute an overapproximation to the reachable states. |
---|
260 | Minimize transition relation using this approximation, and then compute the |
---|
261 | set of reachable states exactly. This may accelerate reachability |
---|
262 | analysis. Refer to the paper by Moon et al, ICCAD98. The BDD minimizing |
---|
263 | method can be chosen by using "set image_minimize_method <method>" <A HREF = |
---|
264 | "setCmd.html"><code>set</code></A>. This option is incompatible with -i. |
---|
265 | <p> |
---|
266 | |
---|
267 | <dt> -F |
---|
268 | <dd> Force to recompute reachable states. |
---|
269 | <p> |
---|
270 | |
---|
271 | <dt> Related "set" options: <p> |
---|
272 | <dt> rch_simulate <#> |
---|
273 | <dd> The set option can be used to set this flag rch_simulate to specify the |
---|
274 | number of random vectors to be simulated. Default value for this number is 0. |
---|
275 | <p> |
---|
276 | |
---|
277 | ] |
---|
278 | |
---|
279 | SideEffects [The reachable states, depth, initial states of the FSM are |
---|
280 | stored.] |
---|
281 | |
---|
282 | ******************************************************************************/ |
---|
283 | static int |
---|
284 | CommandComputeReach( |
---|
285 | Hrc_Manager_t ** hmgr, |
---|
286 | int argc, |
---|
287 | char ** argv) |
---|
288 | { |
---|
289 | int c; |
---|
290 | mdd_t *reachableStates = NIL(mdd_t); |
---|
291 | mdd_t *initialStates; |
---|
292 | long initialTime; |
---|
293 | long finalTime; |
---|
294 | static int verbosityLevel; |
---|
295 | static int printStep; |
---|
296 | static int timeOutPeriod; |
---|
297 | Fsm_Fsm_t *fsm = Fsm_HrcManagerReadCurrentFsm(*hmgr); |
---|
298 | static int reorderFlag; |
---|
299 | static int reorderThreshold; |
---|
300 | static int shellFlag; |
---|
301 | static int depthValue; |
---|
302 | static int incrementalFlag; |
---|
303 | static int approxFlag; |
---|
304 | static int ardc; |
---|
305 | static int recompute; |
---|
306 | Fsm_RchType_t rchType; |
---|
307 | FILE *guideFile = NIL(FILE); /* file of hints for guided search */ |
---|
308 | array_t *guideArray = NIL(array_t); |
---|
309 | Img_MethodType imgMethod; |
---|
310 | |
---|
311 | /* |
---|
312 | * These are the default values. These variables must be declared static |
---|
313 | * to avoid lint warnings. Since they are static, we must reinitialize |
---|
314 | * them outside of the variable declarations. |
---|
315 | */ |
---|
316 | verbosityLevel = 0; |
---|
317 | printStep = 0; |
---|
318 | timeOutPeriod = 0; |
---|
319 | shellFlag = 0; |
---|
320 | depthValue = 0; |
---|
321 | incrementalFlag = 0; |
---|
322 | rchType = Fsm_Rch_Default_c; |
---|
323 | approxFlag = 0; |
---|
324 | ardc = 0; |
---|
325 | recompute = 0; |
---|
326 | |
---|
327 | /* |
---|
328 | * Parse command line options. |
---|
329 | */ |
---|
330 | util_getopt_reset(); |
---|
331 | while ((c = util_getopt(argc, argv, "d:fg:hir:s:t:v:A:DF")) != EOF) { |
---|
332 | switch(c) { |
---|
333 | case 'd': |
---|
334 | depthValue = atoi(util_optarg); |
---|
335 | break; |
---|
336 | case 'f': |
---|
337 | shellFlag = 1; |
---|
338 | break; |
---|
339 | case 'g': |
---|
340 | guideFile = Cmd_FileOpen(util_optarg, "r", NIL(char *), 0); |
---|
341 | if (guideFile == NIL(FILE)) { |
---|
342 | fprintf(vis_stdout, |
---|
343 | "** rch error: Guide file cannot be read. Check permissions and path\n"); |
---|
344 | goto usage; |
---|
345 | } |
---|
346 | break; |
---|
347 | case 'h': |
---|
348 | goto usage; |
---|
349 | case 'i': |
---|
350 | incrementalFlag = 1; |
---|
351 | break; |
---|
352 | case 'r': |
---|
353 | reorderFlag = 1; |
---|
354 | reorderThreshold = atoi(util_optarg); |
---|
355 | break; |
---|
356 | case 's': |
---|
357 | printStep = atoi(util_optarg); |
---|
358 | break; |
---|
359 | case 't': |
---|
360 | timeOutPeriod = atoi(util_optarg); |
---|
361 | break; |
---|
362 | case 'v': |
---|
363 | verbosityLevel = atoi(util_optarg); |
---|
364 | break; |
---|
365 | case 'A' : |
---|
366 | approxFlag = atoi(util_optarg); |
---|
367 | if ((approxFlag > 2) || (approxFlag < 0)) { |
---|
368 | goto usage; |
---|
369 | } |
---|
370 | break; |
---|
371 | case 'D': |
---|
372 | ardc = 1; |
---|
373 | break; |
---|
374 | case 'F': |
---|
375 | recompute = 1; |
---|
376 | break; |
---|
377 | default: |
---|
378 | goto usage; |
---|
379 | } |
---|
380 | } |
---|
381 | if (c == EOF && argc != util_optind) |
---|
382 | goto usage; |
---|
383 | |
---|
384 | imgMethod = Img_UserSpecifiedMethod(); |
---|
385 | |
---|
386 | if ((approxFlag == 1) && (bdd_get_package_name() != CUDD)) { |
---|
387 | fprintf(vis_stderr, "** rch error: compute_reach with -A 1 option is currently supported only by CUDD.\n"); |
---|
388 | return 1; |
---|
389 | } |
---|
390 | |
---|
391 | if (fsm == NIL(Fsm_Fsm_t)) { |
---|
392 | return 1; |
---|
393 | } |
---|
394 | |
---|
395 | if (incrementalFlag && approxFlag) { |
---|
396 | fprintf(vis_stdout, |
---|
397 | "** rch error: Incremental flag and approx flag are incompatible.\n"); |
---|
398 | goto usage; |
---|
399 | } |
---|
400 | if (incrementalFlag && ardc) { |
---|
401 | fprintf(vis_stdout, |
---|
402 | "** rch error: The -i and -D flags are incompatible.\n"); |
---|
403 | goto usage; |
---|
404 | } |
---|
405 | |
---|
406 | if (depthValue && approxFlag == 2) { |
---|
407 | fprintf(vis_stdout, |
---|
408 | "** rch error: Depth value and over-approx flag are incompatible.\n"); |
---|
409 | goto usage; |
---|
410 | } |
---|
411 | |
---|
412 | if (shellFlag && approxFlag == 2) { |
---|
413 | fprintf(vis_stdout, |
---|
414 | "** rch error: Shell flag and over-approx flag are incompatible.\n"); |
---|
415 | goto usage; |
---|
416 | } |
---|
417 | |
---|
418 | if (guideFile != NIL(FILE)){ |
---|
419 | if(incrementalFlag) { |
---|
420 | fprintf(vis_stdout, "** rch error: Guided search is not compatible with the -i flag\n"); |
---|
421 | goto usage; |
---|
422 | } |
---|
423 | if(approxFlag == 2){ |
---|
424 | fprintf(vis_stdout, "** rch error: Guided search is not compatible with Over-approx flag\n"); |
---|
425 | goto usage; |
---|
426 | } |
---|
427 | if(imgMethod != Img_Iwls95_c && imgMethod != Img_Monolithic_c && |
---|
428 | imgMethod != Img_Mlp_c){ |
---|
429 | fprintf(vis_stdout, "** rch error: Guided search can only be performed\n"); |
---|
430 | fprintf(vis_stdout, "with IWLS95, MLP, or Monolithic image methods.\n"); |
---|
431 | goto usage; |
---|
432 | } |
---|
433 | }/* if guided search requested */ |
---|
434 | |
---|
435 | /* Start the timeOut timer. */ |
---|
436 | if (timeOutPeriod > 0){ |
---|
437 | (void) signal(SIGALRM, (void(*)(int))TimeOutHandle); |
---|
438 | (void) alarm(timeOutPeriod); |
---|
439 | if (setjmp(timeOutEnv) > 0) { |
---|
440 | (void) fprintf(vis_stdout, "** rch info: Timeout occurred after %d seconds.\n", |
---|
441 | timeOutPeriod); |
---|
442 | (void) fprintf(vis_stdout, "** rch warning: The time out may have " |
---|
443 | "corrupted the data.\n"); |
---|
444 | alarm(0); |
---|
445 | return 1; |
---|
446 | } |
---|
447 | } |
---|
448 | |
---|
449 | /* Make sure that the initial states can be computed without a problem. */ |
---|
450 | error_init(); |
---|
451 | initialStates = Fsm_FsmComputeInitialStates(fsm); |
---|
452 | if (initialStates == NIL(mdd_t)) { |
---|
453 | (void) fprintf(vis_stderr, "** rch error: Latch initialization function depends on another latch:\n"); |
---|
454 | (void) fprintf(vis_stderr, "%s", error_string()); |
---|
455 | (void) fprintf(vis_stderr, "\n"); |
---|
456 | (void) fprintf(vis_stderr, "** rch error: Initial states cannot be computed.\n"); |
---|
457 | return (1); |
---|
458 | } |
---|
459 | else { |
---|
460 | mdd_free(initialStates); |
---|
461 | } |
---|
462 | |
---|
463 | /* translate approx flag */ |
---|
464 | switch(approxFlag) { |
---|
465 | case 0: rchType = Fsm_Rch_Bfs_c; break; |
---|
466 | case 1: rchType = Fsm_Rch_Hd_c; break; |
---|
467 | case 2: rchType = Fsm_Rch_Oa_c; break; |
---|
468 | default: rchType = Fsm_Rch_Default_c; break; |
---|
469 | } |
---|
470 | |
---|
471 | if (guideFile != NIL(FILE)) { |
---|
472 | guideArray = Mc_ComputeGuideArray(fsm, guideFile); |
---|
473 | if(guideArray == NIL(array_t)) |
---|
474 | return(1); |
---|
475 | } |
---|
476 | |
---|
477 | if (rchType == Fsm_Rch_Oa_c) { |
---|
478 | array_t *apprReachableStates; |
---|
479 | |
---|
480 | initialTime = util_cpu_time(); |
---|
481 | apprReachableStates = Fsm_FsmComputeOverApproximateReachableStates(fsm, |
---|
482 | incrementalFlag, verbosityLevel, printStep, depthValue, shellFlag, |
---|
483 | reorderFlag, reorderThreshold, recompute); |
---|
484 | finalTime = util_cpu_time(); |
---|
485 | |
---|
486 | if (apprReachableStates == NIL(array_t)) { |
---|
487 | (void)fprintf(vis_stdout, |
---|
488 | "** rch error: Reachability computation failed, no rechable states\n"); |
---|
489 | return 1; |
---|
490 | } |
---|
491 | |
---|
492 | if (verbosityLevel > 0) |
---|
493 | Fsm_ArdcPrintReachabilityResults(fsm, finalTime-initialTime); |
---|
494 | alarm(0); |
---|
495 | return(0); |
---|
496 | } |
---|
497 | |
---|
498 | /* Compute the reachable states. */ |
---|
499 | initialTime = util_cpu_time(); |
---|
500 | reachableStates = Fsm_FsmComputeReachableStates( |
---|
501 | fsm, incrementalFlag, verbosityLevel, printStep, depthValue, shellFlag, |
---|
502 | reorderFlag, reorderThreshold, rchType, ardc, recompute, NIL(array_t), |
---|
503 | (verbosityLevel > 0), guideArray); |
---|
504 | finalTime = util_cpu_time(); |
---|
505 | mdd_array_free(guideArray); |
---|
506 | |
---|
507 | if (reachableStates == NIL(mdd_t)) { |
---|
508 | (void)fprintf(vis_stdout, "** rch error: Reachability computation failed, no rechable states\n"); |
---|
509 | return 1; |
---|
510 | } |
---|
511 | |
---|
512 | if (verbosityLevel > 0){ |
---|
513 | if (fsm->imageInfo){ |
---|
514 | char *methodType = |
---|
515 | Img_ImageInfoObtainMethodTypeAsString(fsm->imageInfo); |
---|
516 | (void) fprintf(vis_stdout, "** rch info: Computing reachable states using the "); |
---|
517 | (void) fprintf(vis_stdout, "%s image computation method.\n", methodType); |
---|
518 | FREE(methodType); |
---|
519 | (void)Img_ImageInfoPrintMethodParams(fsm->imageInfo, |
---|
520 | vis_stdout); |
---|
521 | if (Img_ImageInfoObtainMethodType(fsm->imageInfo) == Img_Tfm_c || |
---|
522 | Img_ImageInfoObtainMethodType(fsm->imageInfo) == Img_Hybrid_c) { |
---|
523 | Img_TfmPrintStatistics(fsm->imageInfo, Img_Forward_c); |
---|
524 | } |
---|
525 | } |
---|
526 | Fsm_FsmReachabilityPrintResults(fsm, finalTime-initialTime, approxFlag); |
---|
527 | |
---|
528 | } |
---|
529 | mdd_free(reachableStates); |
---|
530 | |
---|
531 | alarm(0); |
---|
532 | return (0); |
---|
533 | |
---|
534 | usage: |
---|
535 | (void) fprintf(vis_stderr, "usage: compute_reach [-d depthValue] [-h] [-f] [-i] [-g <hint file>][-r thresholdValue] [-s printStep] [-t timeOut] [-v #][-A #][-D][-F]\n"); |
---|
536 | (void) fprintf(vis_stderr, " -d depthValue perform reachability up to depthValue steps\n"); |
---|
537 | (void) fprintf(vis_stderr, " -f \t\t store the onion rings ateach step\n"); |
---|
538 | (void) fprintf(vis_stderr, " -h \t\t print the command usage\n"); |
---|
539 | (void) fprintf(vis_stderr, " -g filename\t perform reachability analysis with guided search using the given file. Not allowed with -A 2\n"); |
---|
540 | (void) fprintf(vis_stderr, " -i \t\t builds the transition relation incrementally (not supported with -A 1,2).\n"); |
---|
541 | (void) fprintf(vis_stderr, " -r thresholdValue invoke dynamic reordering once when the size of the reached state set reaches this value.\n"); |
---|
542 | (void) fprintf(vis_stderr, " -s printStep\t print reachability information every printStep steps (0 for no information).\n"); |
---|
543 | (void) fprintf(vis_stderr, " -t time\t time out period (in seconds)\n"); |
---|
544 | (void) fprintf(vis_stderr, " -v #\t\t verbosity level\n"); |
---|
545 | (void) fprintf(vis_stderr, " -A #\t\t 0 (default) - BFS method.\n"); |
---|
546 | (void) fprintf(vis_stderr, " #\t\t 1 - HD method.\n"); |
---|
547 | (void) fprintf(vis_stderr, " #\t\t 2 - Over-approximation by approximate traversal.\n"); |
---|
548 | (void) fprintf(vis_stderr, " -D \t\t Try to minimize transition relation with ARDCs\n"); |
---|
549 | (void) fprintf(vis_stderr, " -F \t\t force to recompute reachable states\n"); |
---|
550 | return 1; |
---|
551 | } |
---|
552 | |
---|
553 | |
---|
554 | /**Function******************************************************************** |
---|
555 | |
---|
556 | Synopsis [Implements the read_fairness command.] |
---|
557 | |
---|
558 | Description [If no network or FSM exists, does nothing. Otherwise, parses |
---|
559 | the CTL formulas in the input file, and creates a fairness constraint data |
---|
560 | structure to store them. Currently, only Buchi constraints are parsed. |
---|
561 | This command does not do any computation on the fairness constraint.] |
---|
562 | |
---|
563 | Comment [To support Streett conditions, we need a delimiter in the input |
---|
564 | file to group finallyInf/globallyInf pairs (a "horizontal" delimiter). To |
---|
565 | support canonical fairness constraints, we additionally need a "vertical" |
---|
566 | delimiter to group different disjuncts.] |
---|
567 | |
---|
568 | CommandName [read_fairness] |
---|
569 | |
---|
570 | CommandSynopsis [read a fairness constraint] |
---|
571 | |
---|
572 | CommandArguments [\[-h\] <file>] |
---|
573 | |
---|
574 | CommandDescription [Read a fairness constraint, and associate this |
---|
575 | constraint with the FSM of the flattened network. An existing constraint |
---|
576 | associated with the FSM is lost. Subsequent verification procedures are |
---|
577 | performed relative to the new constraint. Note that, by default, the |
---|
578 | flattened network has the constraint TRUE, indicating that all paths are |
---|
579 | fair. The command <tt>build_partition_mdds</tt> (or <tt>init_verify</tt>) |
---|
580 | must have already been invoked on the flattened network, before this command |
---|
581 | is called.<p> |
---|
582 | |
---|
583 | Currently, only Buchi constraints are supported. A Buchi fairness constraint |
---|
584 | is given by a list of individual Buchi conditions, B1, B2, ..., Bk, where Bi |
---|
585 | is a set of FSM states. A state is fair if there exists an infinite path |
---|
586 | from that state that intersects each Bi infinitely often.<p> |
---|
587 | |
---|
588 | The conditions are specified by a file containing at least one CTL formula |
---|
589 | (see the <A HREF="../ctl/ctl/ctl.html"> VIS CTL and LTL syntax manual</A>). In |
---|
590 | particular, Bi is defined by a CTL formula, which represents the set of |
---|
591 | states that makes the formula true (in the absence of any fairness |
---|
592 | constraint). References to signal names in the network should be made using |
---|
593 | the full hierarchical names. Note that the support of any wire referred to |
---|
594 | in a formula should consist only of latches. Each CTL formula is terminated |
---|
595 | by a semicolon.<p> |
---|
596 | |
---|
597 | Example: In the three conditions below, B1 contains those states that have a |
---|
598 | next state where cntr.out is RED, B2 contains those where timer.active is 1, |
---|
599 | and B3 contains those states for which every path from the state has |
---|
600 | tlc.request=1 until tlc.acknowledge=1.<p> |
---|
601 | |
---|
602 | <pre> |
---|
603 | EX(cntr.out=RED); |
---|
604 | (timer.active=1); |
---|
605 | A(tlc.request=1 U tlc.acknowledge=1); |
---|
606 | </pre> |
---|
607 | |
---|
608 | Command options:<p> |
---|
609 | |
---|
610 | <dl> |
---|
611 | |
---|
612 | <dt> -h |
---|
613 | <dd> Print the command usage.<p> |
---|
614 | |
---|
615 | <dt> <file> |
---|
616 | <dd> File containing the set of Buchi conditions.<p> |
---|
617 | |
---|
618 | </dl> |
---|
619 | ] |
---|
620 | |
---|
621 | SideEffects [] |
---|
622 | |
---|
623 | ******************************************************************************/ |
---|
624 | static int |
---|
625 | CommandReadFairness( |
---|
626 | Hrc_Manager_t ** hmgr, |
---|
627 | int argc, |
---|
628 | char ** argv) |
---|
629 | { |
---|
630 | int c; |
---|
631 | FILE *fp; |
---|
632 | array_t *formulaArray; |
---|
633 | Fsm_Fsm_t *fsm = Fsm_HrcManagerReadCurrentFsm(*hmgr); |
---|
634 | |
---|
635 | /* |
---|
636 | * Parse command line options. |
---|
637 | */ |
---|
638 | util_getopt_reset(); |
---|
639 | while ((c = util_getopt(argc, argv, "h")) != EOF) { |
---|
640 | switch(c) { |
---|
641 | case 'h': |
---|
642 | goto usage; |
---|
643 | default: |
---|
644 | goto usage; |
---|
645 | } |
---|
646 | /* NOT REACHED */ |
---|
647 | } |
---|
648 | |
---|
649 | if (fsm == NIL(Fsm_Fsm_t)) { |
---|
650 | (void) fprintf(vis_stderr, "** fair error: Fairness constraint not recorded.\n"); |
---|
651 | return 1; |
---|
652 | } |
---|
653 | |
---|
654 | /* |
---|
655 | * Open the fairness file. |
---|
656 | */ |
---|
657 | if (argc - util_optind == 0) { |
---|
658 | (void) fprintf(vis_stderr, "** fair error: fairness file not provided\n"); |
---|
659 | goto usage; |
---|
660 | } |
---|
661 | else if (argc - util_optind > 1) { |
---|
662 | (void) fprintf(vis_stderr, "** fair error: too many arguments\n"); |
---|
663 | goto usage; |
---|
664 | } |
---|
665 | |
---|
666 | fp = Cmd_FileOpen(argv[util_optind], "r", NIL(char *), 0); |
---|
667 | if (fp == NIL(FILE)) { |
---|
668 | return 1; |
---|
669 | } |
---|
670 | |
---|
671 | /* |
---|
672 | * Parse the formulas in the file. |
---|
673 | */ |
---|
674 | formulaArray = Ctlp_FileParseFormulaArray(fp); |
---|
675 | (void) fclose(fp); |
---|
676 | |
---|
677 | if (formulaArray == NIL(array_t)) { |
---|
678 | (void) fprintf(vis_stderr, "** fair error: error reading fairness conditions.\n"); |
---|
679 | return 1; |
---|
680 | } |
---|
681 | else if (array_n(formulaArray) == 0) { |
---|
682 | (void) fprintf(vis_stderr, "** fair error: fairness file is empty.\n"); |
---|
683 | (void) fprintf(vis_stderr, "** fair error: Use reset_fairness to reset the fairness constraint."); |
---|
684 | return 1; |
---|
685 | } |
---|
686 | else { |
---|
687 | int j; |
---|
688 | Fsm_Fairness_t *fairness; |
---|
689 | Ntk_Network_t *network = Fsm_FsmReadNetwork(fsm); |
---|
690 | |
---|
691 | /* |
---|
692 | * First check that each formula is semantically correct wrt the network. |
---|
693 | */ |
---|
694 | error_init(); |
---|
695 | for (j = 0; j < array_n(formulaArray); j++) { |
---|
696 | Ctlp_Formula_t *formula; |
---|
697 | boolean status; |
---|
698 | |
---|
699 | formula = array_fetch(Ctlp_Formula_t *, formulaArray, j); |
---|
700 | status = Mc_FormulaStaticSemanticCheckOnNetwork(formula, network, FALSE); |
---|
701 | |
---|
702 | if (status == FALSE) { |
---|
703 | (void) fprintf(vis_stderr, |
---|
704 | "** fair error: error reading fairness constraint "); |
---|
705 | Ctlp_FormulaPrint(vis_stderr, formula); |
---|
706 | (void) fprintf(vis_stderr, ":\n"); |
---|
707 | (void) fprintf(vis_stderr, "%s", error_string()); |
---|
708 | (void) fprintf(vis_stderr, "\n"); |
---|
709 | return 1; |
---|
710 | } |
---|
711 | } |
---|
712 | |
---|
713 | |
---|
714 | /* |
---|
715 | * Interpret the array of CTL formulas as a set of Buchi conditions. |
---|
716 | * Hence, create a single disjunct, consisting of k conjuncts, where k is |
---|
717 | * the number of CTL formulas read in. The jth conjunct has the jth |
---|
718 | * formula as its finallyInf component, and NULL as its globallyInf |
---|
719 | * component. |
---|
720 | */ |
---|
721 | fairness = FsmFairnessAlloc(fsm); |
---|
722 | for (j = 0; j < array_n(formulaArray); j++) { |
---|
723 | Ctlp_Formula_t *formula = array_fetch(Ctlp_Formula_t *, formulaArray, j); |
---|
724 | |
---|
725 | FsmFairnessAddConjunct(fairness, formula, NIL(Ctlp_Formula_t), 0, j); |
---|
726 | } |
---|
727 | array_free(formulaArray); /* Don't free the formulas themselves. */ |
---|
728 | |
---|
729 | /* |
---|
730 | * Remove any existing fairnessInfo associated with the FSM, and update |
---|
731 | * the fairnessInfo.constraint with the new fairness just read. |
---|
732 | */ |
---|
733 | FsmFsmFairnessInfoUpdate(fsm, NIL(mdd_t), fairness, NIL(array_t)); |
---|
734 | |
---|
735 | return 0; |
---|
736 | } |
---|
737 | |
---|
738 | usage: |
---|
739 | (void) fprintf(vis_stderr, "usage: read_fairness [-h] file\n"); |
---|
740 | (void) fprintf(vis_stderr, " -h print the command usage\n"); |
---|
741 | (void) fprintf(vis_stderr, " file file containing the list of conditions\n"); |
---|
742 | return 1; |
---|
743 | } |
---|
744 | |
---|
745 | |
---|
746 | /**Function******************************************************************** |
---|
747 | |
---|
748 | Synopsis [Implements the reset_fairness command.] |
---|
749 | |
---|
750 | Description [If no network or FSM exists, does nothing. Otherwise, resets |
---|
751 | the fairnessInfo associated with the FSM to the default case.] |
---|
752 | |
---|
753 | CommandName [reset_fairness] |
---|
754 | |
---|
755 | CommandSynopsis [reset the fairness constraint] |
---|
756 | |
---|
757 | CommandArguments [\[-h\]] |
---|
758 | |
---|
759 | CommandDescription [Remove any existing fairness constraint associated with |
---|
760 | the FSM of the flattened network, and impose a single constraint, TRUE, |
---|
761 | indicating that all states are "accepting".<p> |
---|
762 | |
---|
763 | Command options:<p> |
---|
764 | |
---|
765 | <dl> |
---|
766 | |
---|
767 | <dt> -h |
---|
768 | <dd> Print the command usage.<p> |
---|
769 | |
---|
770 | </dl> |
---|
771 | ] |
---|
772 | |
---|
773 | SideEffects [] |
---|
774 | |
---|
775 | ******************************************************************************/ |
---|
776 | static int |
---|
777 | CommandResetFairness( |
---|
778 | Hrc_Manager_t ** hmgr, |
---|
779 | int argc, |
---|
780 | char ** argv) |
---|
781 | { |
---|
782 | int c; |
---|
783 | Fsm_Fsm_t *fsm = Fsm_HrcManagerReadCurrentFsm(*hmgr); |
---|
784 | |
---|
785 | /* |
---|
786 | * Parse command line options. |
---|
787 | */ |
---|
788 | util_getopt_reset(); |
---|
789 | while ((c = util_getopt(argc, argv, "h")) != EOF) { |
---|
790 | switch(c) { |
---|
791 | case 'h': |
---|
792 | goto usage; |
---|
793 | default: |
---|
794 | goto usage; |
---|
795 | } |
---|
796 | /* NOT REACHED */ |
---|
797 | } |
---|
798 | |
---|
799 | if (fsm == NIL(Fsm_Fsm_t)) { |
---|
800 | return 1; |
---|
801 | } |
---|
802 | |
---|
803 | /* |
---|
804 | * Remove any existing fairnessInfo associated with the FSM, and add back |
---|
805 | * the default constraint. |
---|
806 | */ |
---|
807 | FsmFsmFairnessInfoUpdate(fsm, NIL(mdd_t), NIL(Fsm_Fairness_t), NIL(array_t)); |
---|
808 | fsm->fairnessInfo.constraint = FsmFsmCreateDefaultFairnessConstraint(fsm); |
---|
809 | |
---|
810 | return 0; |
---|
811 | |
---|
812 | |
---|
813 | usage: |
---|
814 | (void) fprintf(vis_stderr, "usage: reset_fairness [-h]\n"); |
---|
815 | (void) fprintf(vis_stderr, " -h print the command usage\n"); |
---|
816 | return 1; |
---|
817 | } |
---|
818 | |
---|
819 | |
---|
820 | /**Function******************************************************************** |
---|
821 | |
---|
822 | Synopsis [Implements the print_fairness command.] |
---|
823 | |
---|
824 | Description [If no network or FSM exists, does nothing. Otherwise, prints |
---|
825 | the fairness constraint associated with the FSM. If no fairness |
---|
826 | constraint exists, then prints a message to that affect.] |
---|
827 | |
---|
828 | CommandName [print_fairness] |
---|
829 | |
---|
830 | CommandSynopsis [print the fairness constraint of the flattened network] |
---|
831 | |
---|
832 | CommandArguments [\[-h\]] |
---|
833 | |
---|
834 | CommandDescription [Print the fairness constraint (i.e the set of Buchi |
---|
835 | conditions) associated with the FSM of the flattened network. By default, |
---|
836 | the flattened network has the single constraint TRUE, indicating that all |
---|
837 | paths are fair.<p> |
---|
838 | |
---|
839 | Command options:<p> |
---|
840 | |
---|
841 | <dl> |
---|
842 | |
---|
843 | <dt> -h |
---|
844 | <dd> Print the command usage.<p> |
---|
845 | |
---|
846 | </dl> |
---|
847 | ] |
---|
848 | |
---|
849 | SideEffects [] |
---|
850 | |
---|
851 | ******************************************************************************/ |
---|
852 | static int |
---|
853 | CommandPrintFairness( |
---|
854 | Hrc_Manager_t ** hmgr, |
---|
855 | int argc, |
---|
856 | char ** argv) |
---|
857 | { |
---|
858 | int c; |
---|
859 | Fsm_Fairness_t *constraint; |
---|
860 | int numDisjuncts; |
---|
861 | Fsm_Fsm_t *fsm = Fsm_HrcManagerReadCurrentFsm(*hmgr); |
---|
862 | |
---|
863 | /* |
---|
864 | * Parse command line options. |
---|
865 | */ |
---|
866 | util_getopt_reset(); |
---|
867 | while ((c = util_getopt(argc, argv, "h")) != EOF) { |
---|
868 | switch(c) { |
---|
869 | case 'h': |
---|
870 | goto usage; |
---|
871 | default: |
---|
872 | goto usage; |
---|
873 | } |
---|
874 | /* NOT REACHED */ |
---|
875 | } |
---|
876 | |
---|
877 | if (fsm == NIL(Fsm_Fsm_t)) { |
---|
878 | return 1; |
---|
879 | } |
---|
880 | |
---|
881 | /* |
---|
882 | * Print the fairness constraint. It is assumed that there is at least one |
---|
883 | * disjunct present. Currently, only Buchi constraints can be printed out. |
---|
884 | */ |
---|
885 | constraint = Fsm_FsmReadFairnessConstraint(fsm); |
---|
886 | assert(constraint != NIL(Fsm_Fairness_t)); |
---|
887 | numDisjuncts = Fsm_FairnessReadNumDisjuncts(constraint); |
---|
888 | assert(numDisjuncts != 0); |
---|
889 | |
---|
890 | if (numDisjuncts > 1) { |
---|
891 | (void) fprintf(vis_stdout, "Fairness constraint not Buchi..."); |
---|
892 | (void) fprintf(vis_stdout, "don't know how to print.\n"); |
---|
893 | } |
---|
894 | else { |
---|
895 | int i; |
---|
896 | int numConjuncts = Fsm_FairnessReadNumConjunctsOfDisjunct(constraint, 0); |
---|
897 | |
---|
898 | (void) fprintf(vis_stdout, "Fairness constraint:\n"); |
---|
899 | for (i = 0; i < numConjuncts; i++) { |
---|
900 | if (Fsm_FairnessReadGloballyInfFormula(constraint, 0, i) != |
---|
901 | NIL(Ctlp_Formula_t)) { |
---|
902 | (void) fprintf(vis_stdout, "Fairness constraint not Buchi..."); |
---|
903 | (void) fprintf(vis_stdout, "don't know how to print.\n"); |
---|
904 | } |
---|
905 | |
---|
906 | Ctlp_FormulaPrint(vis_stdout, |
---|
907 | Fsm_FairnessReadFinallyInfFormula(constraint, 0, i)); |
---|
908 | (void) fprintf(vis_stdout, ";\n"); |
---|
909 | } |
---|
910 | } |
---|
911 | |
---|
912 | return 0; |
---|
913 | |
---|
914 | usage: |
---|
915 | (void) fprintf(vis_stderr, "usage: print_fairness [-h]\n"); |
---|
916 | (void) fprintf(vis_stderr, " -h print the command usage\n"); |
---|
917 | return 1; |
---|
918 | } |
---|
919 | |
---|
920 | |
---|
921 | /**Function******************************************************************** |
---|
922 | |
---|
923 | Synopsis [Implements the print_img_info command.] |
---|
924 | |
---|
925 | CommandName [print_img_info] |
---|
926 | |
---|
927 | CommandSynopsis [print information about the image method currently |
---|
928 | in use] |
---|
929 | |
---|
930 | CommandArguments [\[-b\] \[-f\] \[-h\] ] |
---|
931 | |
---|
932 | CommandDescription [Prints information about the image computation method |
---|
933 | currently being used by the FSM. This includes the particular values of |
---|
934 | parameters used by the method for initialization. If the image information |
---|
935 | does not exist, then this command forces the information to be |
---|
936 | computed. If none of the flags (-b or -f) is set, forward |
---|
937 | transition relation is computed. <p> |
---|
938 | |
---|
939 | Command options: <p> |
---|
940 | |
---|
941 | <dl> |
---|
942 | |
---|
943 | <dt> -b |
---|
944 | <dd> Compute the transition relation for backward image computation |
---|
945 | (if needed).<p> |
---|
946 | |
---|
947 | <dt> -f |
---|
948 | <dd> Compute the transition relation for forward image computation |
---|
949 | (if needed).<p> |
---|
950 | |
---|
951 | <dt> -h |
---|
952 | <dd> Print the command usage.<p> |
---|
953 | |
---|
954 | </dl>] |
---|
955 | |
---|
956 | SideEffects [] |
---|
957 | |
---|
958 | ******************************************************************************/ |
---|
959 | static int |
---|
960 | CommandPrintImageInfo(Hrc_Manager_t ** hmgr, int argc, char ** argv) |
---|
961 | { |
---|
962 | int c; |
---|
963 | Img_ImageInfo_t *imageInfo; |
---|
964 | Fsm_Fsm_t *fsm = Fsm_HrcManagerReadCurrentFsm(*hmgr); |
---|
965 | int bwdImgFlag = 0; |
---|
966 | int fwdImgFlag = 0; |
---|
967 | |
---|
968 | util_getopt_reset(); |
---|
969 | while ((c = util_getopt(argc, argv, "bfh")) != EOF) { |
---|
970 | switch(c) { |
---|
971 | case 'b': |
---|
972 | bwdImgFlag = 1; |
---|
973 | break; |
---|
974 | case 'f': |
---|
975 | fwdImgFlag = 1; |
---|
976 | break; |
---|
977 | case 'h': |
---|
978 | goto usage; |
---|
979 | default: |
---|
980 | goto usage; |
---|
981 | } |
---|
982 | } |
---|
983 | |
---|
984 | if (fsm == NIL(Fsm_Fsm_t)) { |
---|
985 | return 1; |
---|
986 | } |
---|
987 | |
---|
988 | if (!(bwdImgFlag || fwdImgFlag)){ |
---|
989 | fwdImgFlag = 1; |
---|
990 | } |
---|
991 | |
---|
992 | imageInfo = Fsm_FsmReadOrCreateImageInfo(fsm, bwdImgFlag, fwdImgFlag); |
---|
993 | Img_ImageInfoPrintMethodParams(imageInfo, vis_stdout); |
---|
994 | return 0; |
---|
995 | |
---|
996 | usage: |
---|
997 | (void) fprintf(vis_stderr,"usage: print_image_method [-b] [-f] [-h]\n"); |
---|
998 | (void) fprintf(vis_stderr, " -b create the backward transition relation\n"); |
---|
999 | (void) fprintf(vis_stderr, " -f create the forward transition relation\n"); |
---|
1000 | (void) fprintf(vis_stderr, " -h print the command usage\n"); |
---|
1001 | return 1; |
---|
1002 | } |
---|
1003 | |
---|
1004 | /**Function******************************************************************** |
---|
1005 | |
---|
1006 | Synopsis [Implements the print_hd_options command.] |
---|
1007 | |
---|
1008 | CommandName [print_hd_options] |
---|
1009 | |
---|
1010 | CommandSynopsis [print information about the HD options currently |
---|
1011 | in use] |
---|
1012 | |
---|
1013 | CommandArguments [\[-h\] ] |
---|
1014 | |
---|
1015 | CommandDescription [Prints information about the current HD options. |
---|
1016 | The HD method is an alternate method to compute a least fixpoint and |
---|
1017 | is provided with the compute_reach and check_invariant commands. |
---|
1018 | The method is described in Ravi and Somenzi, ICCAD95. The command |
---|
1019 | can be used only when compiled with the CUDD package. <p> |
---|
1020 | |
---|
1021 | Command options: <p> |
---|
1022 | |
---|
1023 | <dt> -h |
---|
1024 | <dd> Print the command usage.<p> |
---|
1025 | |
---|
1026 | </dl> |
---|
1027 | |
---|
1028 | Set parameters: The HD options are specified with the set command. |
---|
1029 | |
---|
1030 | <dl> |
---|
1031 | <dt> hd_frontier_approx_method <method> |
---|
1032 | <dd> This option specifes |
---|
1033 | the method to approximate the frontier set. <p> |
---|
1034 | |
---|
1035 | Methods: <p> |
---|
1036 | remap_ua : (Default) The BDD approximation method of DAC98 Ravi, |
---|
1037 | Shiple, McMillan, Somenzi. <p> |
---|
1038 | biased_rua : Approximation method similar to remap_ua, but uses |
---|
1039 | a bias function. The bias function is set appropriate to the context. <p> |
---|
1040 | under_approx : The BDD approximation method of Shiple's thesis. <p> |
---|
1041 | heavy_branch : The BDD approximation method of ICCAD95 Ravi, |
---|
1042 | Somenzi. <p> |
---|
1043 | short_paths : The BDD approximation method of ICCAD95 Ravi, |
---|
1044 | Somenzi. <p> |
---|
1045 | compress : An approximation method that runs short_paths first |
---|
1046 | and then remap_ua. <p> |
---|
1047 | |
---|
1048 | <dt> hd_frontier_approx_threshold <number> |
---|
1049 | <dd> This option specifes the size of the frontier to be used for |
---|
1050 | image computation. The threshold for the various methods is |
---|
1051 | approximate (not strictly adhered to). For the remap_ua and |
---|
1052 | biased_rua method, this threshold is a lower bound and the default |
---|
1053 | is 3500. For the short_paths and heavy_branch methods, this threshold |
---|
1054 | is an upper bound. Therefore, a default of 2000 is set to obtain a |
---|
1055 | meaningful result. Any value lower than 2000 is corrected to this |
---|
1056 | default. This value is also relevant for dead-end computations. In a |
---|
1057 | dead-end, the threshold for each image computation (of a disjunct of |
---|
1058 | Reached) is five times the frontier approximation threshold. When |
---|
1059 | the frontier approximation threshold is 0, the threshold for each |
---|
1060 | dead-end image computation is 5000. <p> |
---|
1061 | |
---|
1062 | <dt> hd_approx_quality <double> |
---|
1063 | <dd> This option specifies the quality factor for the under_approx |
---|
1064 | and remap_ua methods. Default value is 1.0. The range is any |
---|
1065 | double value greater than 0. Smaller quality factors produce smaller |
---|
1066 | results. Meaningful values are between 1 and 2. <p> |
---|
1067 | |
---|
1068 | <dt> hd_approx_bias_quality <double> |
---|
1069 | <dd> This option specifies the quality factor for the biased_rua |
---|
1070 | method. Default value is 0.5. The range is any |
---|
1071 | double value greater than 0. Smaller quality factors produce smaller |
---|
1072 | results. Meaningful values are between 0 and 1.<p> |
---|
1073 | |
---|
1074 | <dt> hd_dead_end <method> |
---|
1075 | <dd> This option specifies the method used for dead-end |
---|
1076 | computation. A "dead-end" is characterized by an empty |
---|
1077 | frontier. A dead-end computation involves generating new states from |
---|
1078 | the reached set. <p> |
---|
1079 | |
---|
1080 | Methods:<p> |
---|
1081 | brute_force : Computes the image of the entire reached |
---|
1082 | set. May be fatal if the reached set is very large. <p> |
---|
1083 | conjuncts : (Default) Computes the image of reached by |
---|
1084 | decomposing into parts. <p> |
---|
1085 | hybrid : Computes the image of a subset of reached. If no |
---|
1086 | new states, then the reaminder is decomposed in parts. <p> |
---|
1087 | |
---|
1088 | <dt> hd_dead_end_approx_method <method> |
---|
1089 | <dd> This option allows the specification of the approximation |
---|
1090 | method to use to compute the subset of Reached at the dead-end. The |
---|
1091 | threshold used is the same as hd_frontier_approx_threshold.<p> |
---|
1092 | |
---|
1093 | For methods, refer hd_frontier_approx_method methods. Default is remap_ua.<p> |
---|
1094 | |
---|
1095 | <dt> hd_no_scrap_states |
---|
1096 | <dd> This allows the option of not adding the "scrap" states. Scrap |
---|
1097 | states are residues from the approximation of the frontier set. |
---|
1098 | Default is to add the scrap states. <p> |
---|
1099 | |
---|
1100 | <dt> hd_new_only |
---|
1101 | <dd> This allows the option of adding considering only new states of |
---|
1102 | each iteration for image computation. The default is to take a set in |
---|
1103 | the interval of the new states and the reached set. <p> |
---|
1104 | |
---|
1105 | <dt> hd_only_partial_image |
---|
1106 | <dd> This allows the option of HD with partial image computation |
---|
1107 | only (no approximation of the frontier set). Default is to allow both |
---|
1108 | partial images and approximation of the frontier set. <p> |
---|
1109 | |
---|
1110 | <dt> Partial Image options: <p> |
---|
1111 | |
---|
1112 | <dt> hd_partial_image_method <method> |
---|
1113 | <dd> This option allows the image computation to approximate the |
---|
1114 | image with the specified method. <p> |
---|
1115 | Methods:<p> |
---|
1116 | approx : (Default) Computes a partial image by |
---|
1117 | under-approximating the intermediate products of image computation. |
---|
1118 | <p> |
---|
1119 | clipping : Computes a partial image by "clipping" the |
---|
1120 | depth of recursion of the and-abstract computations during image |
---|
1121 | computation. <p> |
---|
1122 | |
---|
1123 | <dt> hd_partial_image_threshold <number> |
---|
1124 | <dd> This options allows the specification of a threshold (in terms |
---|
1125 | of bdd node size of the intermediate product) that will trigger |
---|
1126 | approximation of the intermediate product. Default is 200000. This |
---|
1127 | option has to be used in conjunction with hd_partial_image_size. If |
---|
1128 | the value of hd_partial_image_size is larger than this option, then |
---|
1129 | the approximation of the intermediate size will be as large as the |
---|
1130 | hd_partial_image_size number. <p> |
---|
1131 | |
---|
1132 | <dt> hd_partial_image_size <number> |
---|
1133 | <dd> This options allows the specification of a size (in terms of |
---|
1134 | bdd node size of the intermediate product) that is the target size |
---|
1135 | of the approximated intermediate product. Default is 100000. For the |
---|
1136 | short_paths and heavy_branch methods, the size of the approximation |
---|
1137 | is corrected to 10000 if the size specified is lower. This is |
---|
1138 | because the short_paths and heavy_branch methods consider this size |
---|
1139 | as an upper bound on the approximation. This option has to be used |
---|
1140 | in conjunction with hd_partial_image_threshold. If the value of |
---|
1141 | hd_partial_image_threshold is much larger than this option, then the |
---|
1142 | desired size will not be obtained as approximation may not be |
---|
1143 | triggered.<p> |
---|
1144 | |
---|
1145 | <dt> hd_partial_image_approx <method> |
---|
1146 | <dd> This options allows the specification of the method to be used |
---|
1147 | to approximate the intermediate product. <p> |
---|
1148 | |
---|
1149 | For methods, refer hd_frontier_approx_method methods. Default is remap_ua.<p> |
---|
1150 | |
---|
1151 | <dt> hd_partial_image_approx_quality <double> |
---|
1152 | <dd> This option specifies the quality factor for the under_approx |
---|
1153 | and remap_ua methods for partial image computation. Default value is |
---|
1154 | 1.0. Range of values is any double greater than 0. Smaller quality |
---|
1155 | factors produce smaller results. Meaningful values are between 1 and |
---|
1156 | 2. <p> |
---|
1157 | |
---|
1158 | <dt> hd_partial_image_approx_bias_quality <double> |
---|
1159 | <dd> This option specifies the quality factor for the biased_rua |
---|
1160 | method for partial image computation. Default value is |
---|
1161 | 0.5. Range of values is any double greater than 0. Smaller quality |
---|
1162 | factors produce smaller results. Meaningful values are between 0 and |
---|
1163 | 1. <p> |
---|
1164 | |
---|
1165 | <dt> hd_partial_image_clipping_depth <double> |
---|
1166 | <dd> This option allows the specification of the depth at which the |
---|
1167 | recursion can be clipped when _hd_partial_image_method_ is |
---|
1168 | clipping. Range of values is between 0 and 1. The clipping depth is |
---|
1169 | then calculated as the specified fraction of the number of |
---|
1170 | variables. Default is 0.4. <p> |
---|
1171 | |
---|
1172 | </dl> |
---|
1173 | ] |
---|
1174 | |
---|
1175 | SideEffects [] |
---|
1176 | |
---|
1177 | ******************************************************************************/ |
---|
1178 | static int |
---|
1179 | CommandPrintHdOptions(Hrc_Manager_t ** hmgr, int argc, char ** argv) |
---|
1180 | { |
---|
1181 | int c; |
---|
1182 | |
---|
1183 | if (*hmgr == NULL) { |
---|
1184 | fprintf(vis_stderr,"** hrc error: Hierarchy manager is empty\n"); |
---|
1185 | return 1; |
---|
1186 | } |
---|
1187 | |
---|
1188 | util_getopt_reset(); |
---|
1189 | while ((c = util_getopt(argc, argv, "h")) != EOF) { |
---|
1190 | switch(c) { |
---|
1191 | case 'h': |
---|
1192 | goto usage; |
---|
1193 | default: |
---|
1194 | goto usage; |
---|
1195 | } |
---|
1196 | /* NOT REACHED */ |
---|
1197 | } |
---|
1198 | |
---|
1199 | /* print hd options */ |
---|
1200 | FsmHdPrintOptions(); |
---|
1201 | return 0; |
---|
1202 | |
---|
1203 | usage: |
---|
1204 | (void) fprintf(vis_stderr,"usage: print_hd_options [-h]\n"); |
---|
1205 | (void) fprintf(vis_stderr, " -h print the command usage\n"); |
---|
1206 | return 1; |
---|
1207 | } /* end of CommandPrintHdOptions */ |
---|
1208 | |
---|
1209 | |
---|
1210 | /**Function******************************************************************** |
---|
1211 | |
---|
1212 | Synopsis [Implements the print_ardc_options command.] |
---|
1213 | |
---|
1214 | CommandName [print_ardc_options] |
---|
1215 | |
---|
1216 | CommandSynopsis [print information about the ARDC options currently |
---|
1217 | in use] |
---|
1218 | |
---|
1219 | CommandArguments [\[-h\] \[-H\]] |
---|
1220 | |
---|
1221 | CommandDescription [Prints information about the current ARDC options. |
---|
1222 | <p> |
---|
1223 | |
---|
1224 | Command options: <p> |
---|
1225 | |
---|
1226 | <dl> |
---|
1227 | |
---|
1228 | <dt> -h |
---|
1229 | <dd> Print the command usage.<p> |
---|
1230 | |
---|
1231 | <dt> -H |
---|
1232 | <dd> Print the ARDC set command usage.<p> |
---|
1233 | |
---|
1234 | </dl> |
---|
1235 | |
---|
1236 | Set parameters: The ARDC options are specified with the set command. |
---|
1237 | |
---|
1238 | <dl> |
---|
1239 | |
---|
1240 | <dt> ardc_traversal_method <code> <method> </code> |
---|
1241 | <dd> Specify a method for approximate FSM traversal. |
---|
1242 | <p> |
---|
1243 | <dd> |
---|
1244 | <code> method </code> must be one of the following: |
---|
1245 | <p> |
---|
1246 | |
---|
1247 | <code> 0 </code>: MBM (machine by machine). <p> |
---|
1248 | <code> 1 </code>: RFBF(reached frame by frame). <p> |
---|
1249 | <code> 2 </code>: TFBF(to frame by frame). <p> |
---|
1250 | <code> 3 </code>: TMBM(combination of MBM and TFBF). <p> |
---|
1251 | <code> 4 </code>: LMBM(least fixpoint MBM, default). <p> |
---|
1252 | <code> 5 </code>: TLMBM(combination of LMBM and TFBF). <p> |
---|
1253 | |
---|
1254 | <dt> ardc_group_size <code> <size> </code> |
---|
1255 | <dd> Specify the number of latches per group for ARDCS. |
---|
1256 | <p> |
---|
1257 | <dd> |
---|
1258 | <code> size </code> must be a positive integer (default = 8). |
---|
1259 | <p> |
---|
1260 | |
---|
1261 | <dt> ardc_affinity_factor <code> <affinity> </code> |
---|
1262 | <dd> Specify affinity factor to make a group for ARDCs. |
---|
1263 | The available factor is from 0.0(use only correlation) to 1.0(use only |
---|
1264 | dependency). |
---|
1265 | <p> |
---|
1266 | <dd> |
---|
1267 | <code> affinity </code> must be a positive real (default = 0.5). |
---|
1268 | <p> |
---|
1269 | |
---|
1270 | <dt> ardc_max_iteration <code> <iteration> </code> |
---|
1271 | <dd> Specify the maximum iteration count during approximate FSM traversal. |
---|
1272 | Default is 0 which means infinite. |
---|
1273 | <p> |
---|
1274 | <dd> |
---|
1275 | <code> iteration </code> must be a positive integer or zero. |
---|
1276 | <p> |
---|
1277 | |
---|
1278 | <dt> ardc_constrain_target <code> <target> </code> |
---|
1279 | <dd> Specify where image constraining will be applied to. |
---|
1280 | <p> |
---|
1281 | <dd> |
---|
1282 | <code> target </code> must be one of the following: |
---|
1283 | <p> |
---|
1284 | |
---|
1285 | <code> 0 </code>: constrain transition relation (default). <p> |
---|
1286 | <code> 1 </code>: constrain initial states. <p> |
---|
1287 | <code> 2 </code>: constrain both. <p> |
---|
1288 | |
---|
1289 | <dt> ardc_constrain_method <code> <method> </code> |
---|
1290 | <dd> Specify an image constraining method to compute ARDCs. |
---|
1291 | <p> |
---|
1292 | <dd> |
---|
1293 | <code> method </code> must be one of the following: |
---|
1294 | <p> |
---|
1295 | |
---|
1296 | <code> 0 </code>: restrict (default). <p> |
---|
1297 | <code> 1 </code>: constrain <p> |
---|
1298 | <code> 2 </code>: compact (currently supported by only CUDD) <p> |
---|
1299 | <code> 3 </code>: squeeze (currently supported by only CUDD) <p> |
---|
1300 | |
---|
1301 | <dt> ardc_constrain_reorder <code> <method> </code> |
---|
1302 | <dd> Specify whether to enable variable reorderings during consecutive |
---|
1303 | image constraining operations. |
---|
1304 | <p> |
---|
1305 | <dd> |
---|
1306 | <code> method </code> must be one of the following: |
---|
1307 | <p> |
---|
1308 | |
---|
1309 | <code> yes </code>: allow variable reorderings during consecutive image |
---|
1310 | constraining operations (default) <p> |
---|
1311 | <code> no </code>: don't allow variable reorderings during consecutive |
---|
1312 | image constraining operations <p> |
---|
1313 | |
---|
1314 | <dt> ardc_abstract_pseudo_input <code> <method> </code> |
---|
1315 | <dd> Specify when to abstract pseudo primary input variables out |
---|
1316 | from transition relation. |
---|
1317 | <p> |
---|
1318 | <dd> |
---|
1319 | <code> method </code> must be one of the following: |
---|
1320 | <p> |
---|
1321 | |
---|
1322 | <code> 0 </code>: do not abstract pseudo input variables <p> |
---|
1323 | <code> 1 </code>: abstract pseudo inputs before image computation (default)<p> |
---|
1324 | <code> 2 </code>: abstract pseudo inputs at every end of image computation <p> |
---|
1325 | <code> 3 </code>: abstract pseudo inputs at the end of approximate traversal<p> |
---|
1326 | |
---|
1327 | <dt> ardc_decompose_flag <code> <method> </code> |
---|
1328 | <dd> Specify whether to use decomposed approximate reachable states or |
---|
1329 | single conjuncted reachable states. |
---|
1330 | <p> |
---|
1331 | <dd> |
---|
1332 | <code> method </code> must be one of the following: |
---|
1333 | <p> |
---|
1334 | |
---|
1335 | <code> yes </code>: keep decomposed reachable stateses (default) <p> |
---|
1336 | <code> no </code>: make a conjunction of reachable states of all submachines <p> |
---|
1337 | |
---|
1338 | <dt> ardc_projected_initial_flag <code> <method> </code> |
---|
1339 | <dd> Specify which initial states is going to be used. |
---|
1340 | <p> |
---|
1341 | <dd> |
---|
1342 | <code> method </code> must be one of the following: |
---|
1343 | <p> |
---|
1344 | |
---|
1345 | <code> yes </code>: use projected initial states for submachine (default) <p> |
---|
1346 | <code> no </code>: use original initial states for submachine <p> |
---|
1347 | |
---|
1348 | <dt> ardc_image_method <code> <method> </code> |
---|
1349 | <dd> Specify image_mathod during computing reachable states of submachines. |
---|
1350 | <p> |
---|
1351 | <dd> |
---|
1352 | <code> method </code> must be one of the following: |
---|
1353 | <p> |
---|
1354 | |
---|
1355 | <code> monolithic </code>: use monolithic image computation <p> |
---|
1356 | <code> iwls95 </code>: use iwls95 image computation (default) <p> |
---|
1357 | <code> mlp </code>: use mlp image computation <p> |
---|
1358 | <code> tfm </code>: use tfm image computation <p> |
---|
1359 | <code> hybrid </code>: use hybrid image computation <p> |
---|
1360 | |
---|
1361 | <dt> ardc_use_high_density <code> <method> </code> |
---|
1362 | <dd> Specify whether to use high density in computing reachable states |
---|
1363 | of submachines. |
---|
1364 | <p> |
---|
1365 | <dd> |
---|
1366 | <code> method </code> must be one of the following: |
---|
1367 | <p> |
---|
1368 | |
---|
1369 | <code> yes </code>: use High Density for reachable states of submachines <p> |
---|
1370 | <code> no </code>: use BFS for reachable states of submachines (default) <p> |
---|
1371 | |
---|
1372 | <dt> ardc_reorder_ptr <code> <method> </code> |
---|
1373 | <dd> Specify whether to reorder partitioned transition relation after |
---|
1374 | constraining fanin submachines. |
---|
1375 | <p> |
---|
1376 | <dd> |
---|
1377 | <code> method </code> must be one of the following: |
---|
1378 | <p> |
---|
1379 | |
---|
1380 | <code> yes </code>: whenever partitioned transition relation changes, |
---|
1381 | reorders partitioned transition relation <p> |
---|
1382 | <code> no </code>: no reordering of partitioned transition relation (default) <p> |
---|
1383 | |
---|
1384 | <dt> ardc_fanin_constrain_mode <code> <method> </code> |
---|
1385 | <dd> Specify which method will be used in constraining fanin submachines. <p> |
---|
1386 | <dd> |
---|
1387 | <code> method </code> must be one of the following: |
---|
1388 | <p> |
---|
1389 | |
---|
1390 | <code> 0 </code>: constrain w.r.t. the reachable states of fanin submachines |
---|
1391 | (default) <p> |
---|
1392 | <code> 1 </code>: constrain w.r.t. the reachable states of both fanin |
---|
1393 | submachines and itself <p> |
---|
1394 | |
---|
1395 | <dt> ardc_create_pseudo_var_mode <code> <method> </code> |
---|
1396 | <dd> Specify which method will be used to create pseudo input |
---|
1397 | variables of submachines. |
---|
1398 | <p> |
---|
1399 | <dd> |
---|
1400 | <code> method </code> must be one of the following: |
---|
1401 | <p> |
---|
1402 | |
---|
1403 | <code> 0 </code>: makes pseudo input variables with exact support |
---|
1404 | (default) <p> |
---|
1405 | <code> 1 </code>: makes pseudo input variables from all state |
---|
1406 | variables of the other submachines <p> |
---|
1407 | <code> 2 </code>: makes pseudo input variables from all state |
---|
1408 | variables of fanin submachines <p> |
---|
1409 | |
---|
1410 | <dt> ardc_lmbm_initial_mode <code> <method> </code> |
---|
1411 | <dd> Specify which method will be used as initial states in LMBM |
---|
1412 | computation. |
---|
1413 | <p> |
---|
1414 | <dd> |
---|
1415 | <code> method </code> must be one of the following: |
---|
1416 | <p> |
---|
1417 | |
---|
1418 | <code> 0 </code>: use given initial states all the time <p> |
---|
1419 | <code> 1 </code>: use current reached states as initial states (default) <p> |
---|
1420 | <code> 2 </code>: use current frontier as initial states <p> |
---|
1421 | |
---|
1422 | <dt> set ardc_mbm_reuse_tr <code> <method> </code> |
---|
1423 | <dd> Specify whether to reuse already constrained transition relation |
---|
1424 | for next iteratrion in MBM. <p> |
---|
1425 | <dd> |
---|
1426 | <code> method </code> must be one of the following: |
---|
1427 | <p> |
---|
1428 | |
---|
1429 | <code> yes </code>: use constrained transition relation for next iteration <p> |
---|
1430 | <code> no </code>: use original transition relation for next iteration |
---|
1431 | (default) <p> |
---|
1432 | |
---|
1433 | <dt> ardc_read_group <code> <filename> </code> |
---|
1434 | <dd> Specify a filename containing grouping information <p> |
---|
1435 | <dd> |
---|
1436 | <code> filename </code> containing grouping information |
---|
1437 | <p> |
---|
1438 | |
---|
1439 | <dt> ardc_write_group <code> <filename> </code> |
---|
1440 | <dd> Specify a filename to write grouping information <p> |
---|
1441 | <dd> |
---|
1442 | <code> filename </code> to write grouping information |
---|
1443 | <p> |
---|
1444 | |
---|
1445 | <dt> ardc_verbosity <code> <verbosity> </code> |
---|
1446 | <dd> Specify the level of printing information during computing ARDCs. |
---|
1447 | <p> |
---|
1448 | <dd> |
---|
1449 | <code> verbosity </code> must be 0 - 3 (default = 0). |
---|
1450 | <p> |
---|
1451 | |
---|
1452 | </dl> |
---|
1453 | |
---|
1454 | The default settings correspond to the fast variants of LMBM and |
---|
1455 | MBM. MBM never produces a more accurate approximation than LMBM for |
---|
1456 | the same state-space decomposition. However, the corresponding |
---|
1457 | statement does not hold for the fast versions. (That is, FastMBM |
---|
1458 | will occasionally outperform FastLMBM.) To get the slower, but more |
---|
1459 | accurate versions of LMBM and MBM use the following settings: |
---|
1460 | |
---|
1461 | <ul> |
---|
1462 | <li> set ardc_constrain_method 1 |
---|
1463 | <li> set ardc_constrain_reorder no |
---|
1464 | <li> set ardc_abstract_pseudo_input 0 |
---|
1465 | </ul> |
---|
1466 | |
---|
1467 | ] |
---|
1468 | |
---|
1469 | SideEffects [] |
---|
1470 | |
---|
1471 | ******************************************************************************/ |
---|
1472 | static int |
---|
1473 | CommandPrintArdcOptions(Hrc_Manager_t ** hmgr, int argc, char ** argv) |
---|
1474 | { |
---|
1475 | int c; |
---|
1476 | |
---|
1477 | if (*hmgr == NULL) { |
---|
1478 | fprintf(vis_stderr,"** hrc error: Hierarchy manager is empty\n"); |
---|
1479 | return 1; |
---|
1480 | } |
---|
1481 | |
---|
1482 | util_getopt_reset(); |
---|
1483 | while ((c = util_getopt(argc, argv, "hH")) != EOF) { |
---|
1484 | switch(c) { |
---|
1485 | case 'h': |
---|
1486 | goto usage; |
---|
1487 | case 'H': |
---|
1488 | goto usage_ardc; |
---|
1489 | default: |
---|
1490 | goto usage; |
---|
1491 | } |
---|
1492 | /* NOT REACHED */ |
---|
1493 | } |
---|
1494 | |
---|
1495 | /* print ARDC options */ |
---|
1496 | FsmArdcPrintOptions(); |
---|
1497 | return 0; |
---|
1498 | |
---|
1499 | usage: |
---|
1500 | (void) fprintf(vis_stderr,"usage: print_ardc_options [-h] [-H]\n"); |
---|
1501 | (void) fprintf(vis_stderr, " -h print the command usage\n"); |
---|
1502 | (void) fprintf(vis_stderr, " -H print the ARDC set command usage\n"); |
---|
1503 | return 1; |
---|
1504 | usage_ardc: |
---|
1505 | (void) fprintf(vis_stderr, " set ardc_traversal_method <m>\n"); |
---|
1506 | (void) fprintf(vis_stderr, " m = 0 : MBM (machine by machine)\n"); |
---|
1507 | (void) fprintf(vis_stderr, " m = 1 : RFBF(reached frame by frame)\n"); |
---|
1508 | (void) fprintf(vis_stderr, " m = 2 : TFBF(to frame by frame)\n"); |
---|
1509 | (void) fprintf(vis_stderr, " m = 3 : TMBM(TFBF + MBM)\n"); |
---|
1510 | (void) fprintf(vis_stderr, " m = 4 : LMBM(least fixpoint MBM, default)\n"); |
---|
1511 | (void) fprintf(vis_stderr, " m = 5 : TLMBM(TFBF + LMBM)\n"); |
---|
1512 | (void) fprintf(vis_stderr, " set ardc_group_size <n>\n"); |
---|
1513 | (void) fprintf(vis_stderr, " n (default = 8)\n"); |
---|
1514 | (void) fprintf(vis_stderr, " set ardc_affinity_factor <f>\n"); |
---|
1515 | (void) fprintf(vis_stderr, " f = 0.0 - 1.0 (default = 0.5)\n"); |
---|
1516 | (void) fprintf(vis_stderr, " set ardc_max_iteration <n>\n"); |
---|
1517 | (void) fprintf(vis_stderr, " n (default = 0(infinity))\n"); |
---|
1518 | (void) fprintf(vis_stderr, " set ardc_constrain_target <m>\n"); |
---|
1519 | (void) fprintf(vis_stderr, " m = 0 : constrain transition relation (default)\n"); |
---|
1520 | (void) fprintf(vis_stderr, " m = 1 : constrain initial states\n"); |
---|
1521 | (void) fprintf(vis_stderr, " m = 2 : constrain both\n"); |
---|
1522 | (void) fprintf(vis_stderr, " set ardc_constrain_method <m>\n"); |
---|
1523 | (void) fprintf(vis_stderr, " m = 0 : restrict (default)\n"); |
---|
1524 | (void) fprintf(vis_stderr, " m = 1 : constrain\n"); |
---|
1525 | (void) fprintf(vis_stderr, |
---|
1526 | " m = 2 : compact (currently supported by only CUDD)\n"); |
---|
1527 | (void) fprintf(vis_stderr, |
---|
1528 | " m = 3 : squeeze (currently supported by only CUDD)\n"); |
---|
1529 | (void) fprintf(vis_stderr, " set ardc_constrain_reorder <m>\n"); |
---|
1530 | (void) fprintf(vis_stderr, " m = yes : allow variable reorderings during consecutive\n"); |
---|
1531 | (void) fprintf(vis_stderr, " image constraining operations (default)\n"); |
---|
1532 | (void) fprintf(vis_stderr, " m = no : don't allow variable reorderings during consecutive\n"); |
---|
1533 | (void) fprintf(vis_stderr, " image constraining operations\n"); |
---|
1534 | (void) fprintf(vis_stderr, " set ardc_abstract_pseudo_input <m>\n"); |
---|
1535 | (void) fprintf(vis_stderr, " m = 0 : do not abstract pseudo input variables\n"); |
---|
1536 | (void) fprintf(vis_stderr, " m = 1 : abstract pseudo inputs before image computation (default)\n"); |
---|
1537 | (void) fprintf(vis_stderr, " m = 2 : abstract pseudo inputs at every end of image computation\n"); |
---|
1538 | (void) fprintf(vis_stderr, " m = 3 : abstract pseudo inputs at the end of approximate traversal\n"); |
---|
1539 | (void) fprintf(vis_stderr, " set ardc_decompose_flag <m>\n"); |
---|
1540 | (void) fprintf(vis_stderr, " m = yes : keep decomposed reachable stateses (default)\n"); |
---|
1541 | (void) fprintf(vis_stderr, " m = no : make a conjunction of reachable states of all submachines\n"); |
---|
1542 | (void) fprintf(vis_stderr, " set ardc_projected_initial_flag <m>\n"); |
---|
1543 | (void) fprintf(vis_stderr, " m = yes : use projected initial states for submachine (default)\n"); |
---|
1544 | (void) fprintf(vis_stderr, " m = no : use original initial states for submachine\n"); |
---|
1545 | (void) fprintf(vis_stderr, " set ardc_image_method <m>\n"); |
---|
1546 | (void) fprintf(vis_stderr, " m = monolithic : use monolithic image computation for submachines\n"); |
---|
1547 | (void) fprintf(vis_stderr, " m = iwls95 : use iwls95 image computation for submachines (default)\n"); |
---|
1548 | (void) fprintf(vis_stderr, " m = mlp : use mlp image computation for submachines\n"); |
---|
1549 | (void) fprintf(vis_stderr, " m = tfm : use tfm image computation for submachines\n"); |
---|
1550 | (void) fprintf(vis_stderr, " m = hybrid : use hybrid image computation for submachines\n"); |
---|
1551 | (void) fprintf(vis_stderr, " set ardc_use_high_density <m>\n"); |
---|
1552 | (void) fprintf(vis_stderr, " m = yes : use High Density for reachable states of submachines\n"); |
---|
1553 | (void) fprintf(vis_stderr, " m = no : use BFS for reachable states of submachines (default)\n"); |
---|
1554 | (void) fprintf(vis_stderr, " set ardc_create_pseudo_var_mode <m>\n"); |
---|
1555 | (void) fprintf(vis_stderr, " m = 0 : makes pseudo input variables with exact support (default)\n"); |
---|
1556 | (void) fprintf(vis_stderr, " m = 1 : makes pseudo input variables from all state variables of\n"); |
---|
1557 | (void) fprintf(vis_stderr, " the other machines\n"); |
---|
1558 | (void) fprintf(vis_stderr, " m = 2 : makes pseudo input variables from all state variables of\n"); |
---|
1559 | (void) fprintf(vis_stderr, " fanin machines\n"); |
---|
1560 | (void) fprintf(vis_stderr, " set ardc_reorder_ptr <m>\n"); |
---|
1561 | (void) fprintf(vis_stderr, " m = yes : whenever partitioned transition relation changes,\n"); |
---|
1562 | (void) fprintf(vis_stderr, " reorders partitioned transition relation\n"); |
---|
1563 | (void) fprintf(vis_stderr, " m = no : no reordering of partitioned transition relation (default)\n"); |
---|
1564 | (void) fprintf(vis_stderr, " set ardc_fanin_constrain_mode <m>\n"); |
---|
1565 | (void) fprintf(vis_stderr, " m = 0 : constrains w.r.t. the reachable states of fanin machines\n"); |
---|
1566 | (void) fprintf(vis_stderr, " (default)\n"); |
---|
1567 | (void) fprintf(vis_stderr, " m = 1 : constrains w.r.t. the reachable states of both fanin machines\n"); |
---|
1568 | (void) fprintf(vis_stderr, " and itself\n"); |
---|
1569 | (void) fprintf(vis_stderr, " set ardc_lmbm_initial_mode <m>\n"); |
---|
1570 | (void) fprintf(vis_stderr, " m = 0 : use given initial states all the time\n"); |
---|
1571 | (void) fprintf(vis_stderr, " m = 1 : use current reached states as initial states (default)\n"); |
---|
1572 | (void) fprintf(vis_stderr, " m = 2 : use current frontier as initial states\n"); |
---|
1573 | (void) fprintf(vis_stderr, " set ardc_mbm_reuse_tr <m>\n"); |
---|
1574 | (void) fprintf(vis_stderr, " m = yes : use constrained transition relation for next iteration\n"); |
---|
1575 | (void) fprintf(vis_stderr, " m = no : use original transition relation for next iteration (default)\n"); |
---|
1576 | (void) fprintf(vis_stderr, " set ardc_read_group <filename>\n"); |
---|
1577 | (void) fprintf(vis_stderr, " <filename> file containing grouping information\n"); |
---|
1578 | (void) fprintf(vis_stderr, " set ardc_write_group <filename>\n"); |
---|
1579 | (void) fprintf(vis_stderr, " <filename> file to write grouping information\n"); |
---|
1580 | (void) fprintf(vis_stderr, " set ardc_verbosity <n>\n"); |
---|
1581 | (void) fprintf(vis_stderr, " n = 0 - 3 (default = 0)\n"); |
---|
1582 | return 1; |
---|
1583 | } /* end of CommandPrintArdcOptions */ |
---|
1584 | |
---|
1585 | |
---|
1586 | /**Function******************************************************************** |
---|
1587 | |
---|
1588 | Synopsis [Implements the print_tfm_options command.] |
---|
1589 | |
---|
1590 | CommandName [print_tfm_options] |
---|
1591 | |
---|
1592 | CommandSynopsis [print information about the transition function based |
---|
1593 | image computation options currently in use] |
---|
1594 | |
---|
1595 | CommandArguments [\[-h\] \[-H\]] |
---|
1596 | |
---|
1597 | CommandDescription [Prints information about the current transition function |
---|
1598 | based image computation options. |
---|
1599 | <p> |
---|
1600 | |
---|
1601 | Command options: <p> |
---|
1602 | |
---|
1603 | <dl> |
---|
1604 | |
---|
1605 | <dt> -h |
---|
1606 | <dd> Print the command usage.<p> |
---|
1607 | |
---|
1608 | <dt> -H |
---|
1609 | <dd> Print the transition function based image computation set command usage. |
---|
1610 | <p> |
---|
1611 | |
---|
1612 | </dl> |
---|
1613 | |
---|
1614 | Set parameters: The transition function based image computation options are |
---|
1615 | specified with the set command. |
---|
1616 | |
---|
1617 | <dl> |
---|
1618 | |
---|
1619 | <dt> tfm_split_method <code> <method> </code> |
---|
1620 | <dd> Specify a splitting method. <p> |
---|
1621 | <dd> |
---|
1622 | <code> method </code> must be one of the following: |
---|
1623 | <p> |
---|
1624 | |
---|
1625 | <code> 0 </code>: input splitting (default) <p> |
---|
1626 | <code> 1 </code>: output splitting <p> |
---|
1627 | <code> 2 </code>: mixed (input split + output split) <p> |
---|
1628 | |
---|
1629 | <dt> tfm_input_split <code> <method> </code> |
---|
1630 | <dd> Specify an input splitting method. <p> |
---|
1631 | <dd> |
---|
1632 | <code> method </code> must be one of the following: |
---|
1633 | <p> |
---|
1634 | |
---|
1635 | <code> 0 </code>: support before splitting (default) <p> |
---|
1636 | <code> 1 </code>: support after splitting <p> |
---|
1637 | <code> 2 </code>: estimate BDD size after splitting <p> |
---|
1638 | <code> 3 </code>: top variable <p> |
---|
1639 | |
---|
1640 | <dt> tfm_pi_split_flag <code> <method> </code> |
---|
1641 | <dd> Specify whether to allow primary input variables to be chosen |
---|
1642 | as a splitting variable. <p> |
---|
1643 | <dd> |
---|
1644 | <code> method </code> must be one of the following: |
---|
1645 | <p> |
---|
1646 | |
---|
1647 | <code> yes </code>: choose either state or input variable as splitting |
---|
1648 | variable (default) <p> |
---|
1649 | <code> no </code>: choose only state variable as splitting variable <p> |
---|
1650 | |
---|
1651 | <dt> tfm_range_comp <code> <method> </code> |
---|
1652 | <dd> Specify a method whether to convert image to range computataion. <p> |
---|
1653 | <dd> |
---|
1654 | <code> method </code> must be one of the following: |
---|
1655 | <p> |
---|
1656 | |
---|
1657 | <code> 0 </code>: do not convert to range computation <p> |
---|
1658 | <code> 1 </code>: convert image to range computation (default) <p> |
---|
1659 | <code> 2 </code>: use a threshold (tfm_range_threshold, default for |
---|
1660 | hybrid) <p> |
---|
1661 | |
---|
1662 | <dt> tfm_range_threshold <number> |
---|
1663 | <dd> This option is valid only when the tfm_range_comp is set to 2. This |
---|
1664 | threshold is used to determine whether to convert to range computation |
---|
1665 | by comparing the shared BDD size of function vector after constraining |
---|
1666 | w.r.t. from set to its original size. If the size is less than the origianl |
---|
1667 | size * <number>, then we convert to range computation. The default value |
---|
1668 | is 10. <p> |
---|
1669 | |
---|
1670 | <dt> tfm_range_try_threshold <number> |
---|
1671 | <dd> This option is valid only when the tfm_range_comp is set to 2. This |
---|
1672 | option is used to disable checking the condition if it fails to convert |
---|
1673 | consecutively <number> times. The default value is 2. <p> |
---|
1674 | |
---|
1675 | <dt> tfm_range_check_reorder <code> <method> </code> |
---|
1676 | <dd> Specify whether to force to call variable reordering after constraining |
---|
1677 | function vector w.r.t. from set and before checking the condition. <p> |
---|
1678 | <dd> |
---|
1679 | <code> method </code> must be one of the following: |
---|
1680 | <p> |
---|
1681 | |
---|
1682 | <code> yes </code>: force to reorder before checking tfm_range_threshold <p> |
---|
1683 | <code> no </code>: do not reorder (default) <p> |
---|
1684 | |
---|
1685 | <dt> tfm_tie_break_mode <code> <method> </code> |
---|
1686 | <dd> Specify a tie breaking method when we have a tie in choosing |
---|
1687 | a splitting variable in input and output splitting method. <p> |
---|
1688 | <dd> |
---|
1689 | <code> method </code> must be one of the following: |
---|
1690 | <p> |
---|
1691 | |
---|
1692 | <code> 0 </code>: the closest variable to top (default) <p> |
---|
1693 | <code> 1 </code>: the smallest BDD size after splitting <p> |
---|
1694 | |
---|
1695 | <dt> tfm_output_split <code> <method> </code> |
---|
1696 | <dd> Specify an output splitting method. <p> |
---|
1697 | <dd> |
---|
1698 | <code> method </code> must be one of the following: |
---|
1699 | <p> |
---|
1700 | |
---|
1701 | <code> 0 </code>: smallest BDD size (default) <p> |
---|
1702 | <code> 1 </code>: largest BDD size <p> |
---|
1703 | <code> 2 </code>: top variable <p> |
---|
1704 | |
---|
1705 | <dt> tfm_turn_depth <number> |
---|
1706 | <dd> This option is valid only when mixed or hybrid method is chosen. |
---|
1707 | This is used to determine when to switch to the other method at which |
---|
1708 | depth of recursion. The default is 5 for tfm and -1 for hybrid method. <p> |
---|
1709 | |
---|
1710 | <dt> tfm_find_decomp_var <code> <method> </code> |
---|
1711 | <dd> Specify a method whether to try to find a decomposable variable |
---|
1712 | (meaning articulation point) first if any. <p> |
---|
1713 | <dd> |
---|
1714 | <code> method </code> must be one of the following: |
---|
1715 | <p> |
---|
1716 | |
---|
1717 | <code> yes </code>: try to find a decomposable variable (articulation point) |
---|
1718 | <p> |
---|
1719 | <code> no </code>: do not try (default) <p> |
---|
1720 | |
---|
1721 | <dt> tfm_sort_vector_flag <code> <method> </code> |
---|
1722 | <dd> Specify a method whether to sort function vectors to increase cache |
---|
1723 | performance. <p> |
---|
1724 | <dd> |
---|
1725 | <code> method </code> must be one of the following: |
---|
1726 | <p> |
---|
1727 | |
---|
1728 | <code> yes </code>: sort function vectors (default for tfm) <p> |
---|
1729 | <code> no </code>: do not sort (default for hybrid) <p> |
---|
1730 | |
---|
1731 | <dt> tfm_print_stats <code> <method> </code> |
---|
1732 | <dd> Specify a method whether to print statistics for cache and recursions |
---|
1733 | at the end of job.<p> |
---|
1734 | <dd> |
---|
1735 | <code> method </code> must be one of the following: |
---|
1736 | <p> |
---|
1737 | |
---|
1738 | <code> yes </code>: print statistics <p> |
---|
1739 | <code> no </code>: do not print (default) <p> |
---|
1740 | |
---|
1741 | <dt> tfm_print_bdd_size <code> <method> </code> |
---|
1742 | <dd> Specify a method whether to print the BDD size of all intermediate |
---|
1743 | product. <p> |
---|
1744 | <dd> |
---|
1745 | <code> method </code> must be one of the following: |
---|
1746 | <p> |
---|
1747 | |
---|
1748 | <code> yes </code>: print BDD size <p> |
---|
1749 | <code> no </code>: do not print (default) <p> |
---|
1750 | |
---|
1751 | <dt> tfm_split_cube_func <code> <method> </code> |
---|
1752 | <dd> Specify a method whether to try to find a cube in function vector |
---|
1753 | in input splitting, then perform output splitting once w.r.t. the cube. <p> |
---|
1754 | |
---|
1755 | <dd> |
---|
1756 | <code> method </code> must be one of the following: |
---|
1757 | <p> |
---|
1758 | |
---|
1759 | <code> yes </code>: try cube splitting <p> |
---|
1760 | <code> no </code>: do not try (default) <p> |
---|
1761 | |
---|
1762 | <dt> tfm_find_essential <code> <method> </code> |
---|
1763 | <dd> Specify a method whether to try to find essential variables in from set. |
---|
1764 | If a variable occurs in all cubes of a BDD, the variable is called essential. |
---|
1765 | If exists, minimize both function vector and the from set with the essential |
---|
1766 | cube. <p> |
---|
1767 | <dd> |
---|
1768 | <code> method </code> must be one of the following: |
---|
1769 | <p> |
---|
1770 | |
---|
1771 | <code> 0 </code>: do not try (default) <p> |
---|
1772 | <code> 1 </code>: try to find essential variables <p> |
---|
1773 | <code> 2 </code>: on and off dynamically <p> |
---|
1774 | |
---|
1775 | <dt> tfm_print_essential <code> <method> </code> |
---|
1776 | <dd> Specify a method whether to print information about essential variables. |
---|
1777 | <p> |
---|
1778 | <dd> |
---|
1779 | <code> method </code> must be one of the following: |
---|
1780 | <p> |
---|
1781 | |
---|
1782 | <code> 0 </code>: do not print (default) <p> |
---|
1783 | <code> 1 </code>: print only at end <p> |
---|
1784 | <code> 2 </code>: print at every image computation <p> |
---|
1785 | |
---|
1786 | <dt> tfm_use_cache <code> <method> </code> |
---|
1787 | <dd> Specify whether to use an image cache. <p> |
---|
1788 | <dd> |
---|
1789 | <code> method </code> must be one of the following: |
---|
1790 | <p> |
---|
1791 | |
---|
1792 | <code> 0 </code>: do not use cache (default for hybrid) <p> |
---|
1793 | <code> 1 </code>: use cache (default) <p> |
---|
1794 | <code> 2 </code>: store all intermediate results <p> |
---|
1795 | |
---|
1796 | <dt> tfm_global_cache <code> <method> </code> |
---|
1797 | <dd> Specify a method whether to use one global image cache, or one image |
---|
1798 | cache per each machine. <p> |
---|
1799 | <dd> |
---|
1800 | <code> method </code> must be one of the following: |
---|
1801 | <p> |
---|
1802 | |
---|
1803 | <code> yes </code>: use only one global cache (default) <p> |
---|
1804 | <code> no </code>: use one cache per machine <p> |
---|
1805 | |
---|
1806 | <dt> tfm_max_chain_length <number> |
---|
1807 | <dd> This option is used to set the maximum number of items in a slot for |
---|
1808 | conflict. The default is 2. <p> |
---|
1809 | |
---|
1810 | <dt> tfm_init_cache_size <number> |
---|
1811 | <dd> This option is used to set the initial cache size. The number is |
---|
1812 | recommended to be a prime number. Currently, we do not resize the cache size, |
---|
1813 | but for the future extension, we named initial. The default is 1001. <p> |
---|
1814 | |
---|
1815 | <dt> tfm_auto_flush_cache <code> <method> </code> |
---|
1816 | <dd> Specify a method to flush image cache. <p> |
---|
1817 | <dd> |
---|
1818 | <code> method </code> must be one of the following: |
---|
1819 | <p> |
---|
1820 | |
---|
1821 | <code> 0 </code>: flush cache only when requested <p> |
---|
1822 | <code> 1 </code>: flush cache at the end of image computation (default) <p> |
---|
1823 | <code> 2 </code>: flush cache before reordering <p> |
---|
1824 | |
---|
1825 | <dt> tfm_compose_intermediate_vars <code> <method> </code> |
---|
1826 | <dd> Specify a method whether to compose all intermediate variables. <p> |
---|
1827 | <dd> |
---|
1828 | <code> method </code> must be one of the following: |
---|
1829 | <p> |
---|
1830 | |
---|
1831 | <code> yes </code>: compose all <p> |
---|
1832 | <code> no </code>: do not compose (default) <p> |
---|
1833 | |
---|
1834 | <dt> tfm_pre_split_method <code> <method> </code> |
---|
1835 | <dd> Specify a splitting method for preimage computation. <p> |
---|
1836 | <dd> |
---|
1837 | <code> method </code> must be one of the following: |
---|
1838 | <p> |
---|
1839 | |
---|
1840 | <code> 0 </code>: input splitting (domain cofactoring, default) <p> |
---|
1841 | <code> 1 </code>: output splitting (constraint cofactoring) <p> |
---|
1842 | <code> 2 </code>: mixed (input split + output split) <p> |
---|
1843 | <code> 3 </code>: substitution <p> |
---|
1844 | |
---|
1845 | <dt> tfm_pre_input_split <code> <method> </code> |
---|
1846 | <dd> Specify an input splitting method for preimage computation. <p> |
---|
1847 | <dd> |
---|
1848 | <code> method </code> must be one of the following: |
---|
1849 | <p> |
---|
1850 | |
---|
1851 | <code> 0 </code>: support before splitting (default) <p> |
---|
1852 | <code> 1 </code>: support after splitting <p> |
---|
1853 | <code> 2 </code>: estimate BDD size after splitting <p> |
---|
1854 | <code> 3 </code>: top variable <p> |
---|
1855 | |
---|
1856 | <dt> tfm_pre_output_split <code> <method> </code> |
---|
1857 | <dd> Specify an output splitting method for preimage computation. <p> |
---|
1858 | <dd> |
---|
1859 | <code> method </code> must be one of the following: |
---|
1860 | <p> |
---|
1861 | |
---|
1862 | <code> 0 </code>: smallest BDD size (default) <p> |
---|
1863 | <code> 1 </code>: largest BDD size <p> |
---|
1864 | <code> 2 </code>: top variable <p> |
---|
1865 | |
---|
1866 | <dt> tfm_pre_dc_leaf_method <code> <method> </code> |
---|
1867 | <dd> Specify a method to switch to another method to complete preimage |
---|
1868 | computation in domain cofactoring method when no more splitting variable |
---|
1869 | exist. <p> |
---|
1870 | <dd> |
---|
1871 | <code> method </code> must be one of the following: |
---|
1872 | <p> |
---|
1873 | |
---|
1874 | <code> 0 </code>: substitution (default) <p> |
---|
1875 | <code> 1 </code>: constraint cofactoring <p> |
---|
1876 | <code> 2 </code>: hybrid <p> |
---|
1877 | |
---|
1878 | <dt> tfm_pre_minimize <code> <method> </code> |
---|
1879 | <dd> Specify a method whether to minimize transition function vector |
---|
1880 | w.r.t a chosen function in constraint cofactoring method. This |
---|
1881 | option is recommended to use when image cache is disabled, because |
---|
1882 | even though this option can minimize the BDD size of function vector, |
---|
1883 | this may degrade cache performance. <p> |
---|
1884 | <dd> |
---|
1885 | <code> method </code> must be one of the following: |
---|
1886 | <p> |
---|
1887 | |
---|
1888 | <code> yes </code>: minimize function vector w.r.t. a chosen function |
---|
1889 | in constraint cofactoring <p> |
---|
1890 | <code> no </code>: do not minimize (default) <p> |
---|
1891 | |
---|
1892 | <dt> tfm_verbosity <code> <verbosity> </code> |
---|
1893 | <dd> Specify the level of printing information related with transition |
---|
1894 | function method. |
---|
1895 | <p> |
---|
1896 | <dd> |
---|
1897 | <code> verbosity </code> must be 0 - 2 (default = 0). |
---|
1898 | <p> |
---|
1899 | |
---|
1900 | </dl> |
---|
1901 | ] |
---|
1902 | |
---|
1903 | SideEffects [] |
---|
1904 | |
---|
1905 | ******************************************************************************/ |
---|
1906 | static int |
---|
1907 | CommandPrintTfmOptions(Hrc_Manager_t ** hmgr, int argc, char ** argv) |
---|
1908 | { |
---|
1909 | int c; |
---|
1910 | |
---|
1911 | if (*hmgr == NULL) { |
---|
1912 | fprintf(vis_stderr,"** hrc error: Hierarchy manager is empty\n"); |
---|
1913 | return 1; |
---|
1914 | } |
---|
1915 | |
---|
1916 | util_getopt_reset(); |
---|
1917 | while ((c = util_getopt(argc, argv, "hH")) != EOF) { |
---|
1918 | switch(c) { |
---|
1919 | case 'h': |
---|
1920 | goto usage; |
---|
1921 | case 'H': |
---|
1922 | goto usage_tfm; |
---|
1923 | default: |
---|
1924 | goto usage; |
---|
1925 | } |
---|
1926 | /* NOT REACHED */ |
---|
1927 | } |
---|
1928 | |
---|
1929 | /* print transition function based image computation options */ |
---|
1930 | Img_PrintTfmOptions(); |
---|
1931 | return 0; |
---|
1932 | |
---|
1933 | usage: |
---|
1934 | (void) fprintf(vis_stderr,"usage: print_tfm_options [-h] [-H]\n"); |
---|
1935 | (void) fprintf(vis_stderr, " -h print the command usage\n"); |
---|
1936 | (void) fprintf(vis_stderr, " -H print the transition function based "); |
---|
1937 | (void) fprintf(vis_stderr, "image computation set command usage\n"); |
---|
1938 | return 1; |
---|
1939 | usage_tfm: |
---|
1940 | (void) fprintf(vis_stderr, " set tfm_split_method <m>\n"); |
---|
1941 | (void) fprintf(vis_stderr, " m = 0 : input splitting (default)\n"); |
---|
1942 | (void) fprintf(vis_stderr, " m = 1 : output splitting\n"); |
---|
1943 | (void) fprintf(vis_stderr, " m = 2 : mixed (input split + output split)\n"); |
---|
1944 | (void) fprintf(vis_stderr, " set tfm_input_split <m>\n"); |
---|
1945 | (void) fprintf(vis_stderr, " m = 0 : support before splitting (default)\n"); |
---|
1946 | (void) fprintf(vis_stderr, " m = 1 : support after splitting\n"); |
---|
1947 | (void) fprintf(vis_stderr, " m = 2 : estimate BDD size after splitting\n"); |
---|
1948 | (void) fprintf(vis_stderr, " m = 3 : top variable\n"); |
---|
1949 | (void) fprintf(vis_stderr, " set tfm_pi_split_flag <m>\n"); |
---|
1950 | (void) fprintf(vis_stderr, " m = yes : choose either state or input variable as splitting variable\n"); |
---|
1951 | (void) fprintf(vis_stderr, " (default)\n"); |
---|
1952 | (void) fprintf(vis_stderr, " m = no : choose only state variable as splitting variable\n"); |
---|
1953 | (void) fprintf(vis_stderr, " set tfm_range_comp <m>\n"); |
---|
1954 | (void) fprintf(vis_stderr, " m = 0 : do not convert to range computation\n"); |
---|
1955 | (void) fprintf(vis_stderr, " m = 1 : convert image to range computation (default)\n"); |
---|
1956 | (void) fprintf(vis_stderr, " m = 2 : use a threshold (tfm_range_threshold, default for hybrid)\n"); |
---|
1957 | (void) fprintf(vis_stderr, " set tfm_range_threshold <n>\n"); |
---|
1958 | (void) fprintf(vis_stderr, " n (default = 10)\n"); |
---|
1959 | (void) fprintf(vis_stderr, " set tfm_range_try_threshold <n>\n"); |
---|
1960 | (void) fprintf(vis_stderr, " n (default = 2)\n"); |
---|
1961 | (void) fprintf(vis_stderr, " set tfm_range_check_reorder <m>\n"); |
---|
1962 | (void) fprintf(vis_stderr, " m = yes : force to reorder before checking tfm_range_threshold\n"); |
---|
1963 | (void) fprintf(vis_stderr, " m = no : do not reorder (default)\n"); |
---|
1964 | (void) fprintf(vis_stderr, " set tfm_tie_break_mode <m>\n"); |
---|
1965 | (void) fprintf(vis_stderr, " m = 0 : the closest variable to top (default)\n"); |
---|
1966 | (void) fprintf(vis_stderr, " m = 1 : the smallest BDD size after splitting\n"); |
---|
1967 | (void) fprintf(vis_stderr, " set tfm_output_split <m>\n"); |
---|
1968 | (void) fprintf(vis_stderr, " m = 0 : smallest BDD size (default)\n"); |
---|
1969 | (void) fprintf(vis_stderr, " m = 1 : largest BDD size\n"); |
---|
1970 | (void) fprintf(vis_stderr, " m = 2 : top variable\n"); |
---|
1971 | (void) fprintf(vis_stderr, " set tfm_turn_depth <n>\n"); |
---|
1972 | (void) fprintf(vis_stderr, " n (default = 5, -1 for hybrid)\n"); |
---|
1973 | (void) fprintf(vis_stderr, " set tfm_find_decomp_var <m>\n"); |
---|
1974 | (void) fprintf(vis_stderr, " m = yes : try to find a decomposable variable (articulation point)\n"); |
---|
1975 | (void) fprintf(vis_stderr, " m = no : do not try (default)\n"); |
---|
1976 | (void) fprintf(vis_stderr, " set tfm_sort_vector_flag <m>\n"); |
---|
1977 | (void) fprintf(vis_stderr, " m = yes : sort function vectors to utilize cache (default for tfm)\n"); |
---|
1978 | (void) fprintf(vis_stderr, " m = no : do not sort (default for hybrid)\n"); |
---|
1979 | (void) fprintf(vis_stderr, " set tfm_print_stats <m>\n"); |
---|
1980 | (void) fprintf(vis_stderr, " m = yes : print statistics for cache and recursions\n"); |
---|
1981 | (void) fprintf(vis_stderr, " m = no : do not print (default)\n"); |
---|
1982 | (void) fprintf(vis_stderr, " set tfm_print_bdd_size <m>\n"); |
---|
1983 | (void) fprintf(vis_stderr, " m = yes : print BDD size of all intermediate product\n"); |
---|
1984 | (void) fprintf(vis_stderr, " m = no : do not print (default)\n"); |
---|
1985 | (void) fprintf(vis_stderr, " set tfm_split_cube_func <m>\n"); |
---|
1986 | (void) fprintf(vis_stderr, " m = yes : find a cube function element,\n"); |
---|
1987 | (void) fprintf(vis_stderr, " then apply output splitting in input splitting\n"); |
---|
1988 | (void) fprintf(vis_stderr, " m = no : do not try (default)\n"); |
---|
1989 | (void) fprintf(vis_stderr, " set tfm_find_essential <m>\n"); |
---|
1990 | (void) fprintf(vis_stderr, " m = 0 : do not try (default)\n"); |
---|
1991 | (void) fprintf(vis_stderr, " m = 1 : try to find essential variables\n"); |
---|
1992 | (void) fprintf(vis_stderr, " m = 2 : on and off dynamically\n"); |
---|
1993 | (void) fprintf(vis_stderr, " set tfm_print_essential <m>\n"); |
---|
1994 | (void) fprintf(vis_stderr, " m = 0 : do not print (default)\n"); |
---|
1995 | (void) fprintf(vis_stderr, " m = 1 : print only at end\n"); |
---|
1996 | (void) fprintf(vis_stderr, " m = 2 : print at every image computation\n"); |
---|
1997 | (void) fprintf(vis_stderr, " set tfm_use_cache <m>\n"); |
---|
1998 | (void) fprintf(vis_stderr, " m = 0 : do not use cache (default for hybrid)\n"); |
---|
1999 | (void) fprintf(vis_stderr, " m = 1 : use cache (default)\n"); |
---|
2000 | (void) fprintf(vis_stderr, " m = 2 : store all intermediate results\n"); |
---|
2001 | (void) fprintf(vis_stderr, " set tfm_global_cache <m>\n"); |
---|
2002 | (void) fprintf(vis_stderr, " m = yes : use only one global cache (default)\n"); |
---|
2003 | (void) fprintf(vis_stderr, " m = no : use one cache per machine\n"); |
---|
2004 | (void) fprintf(vis_stderr, " set tfm_max_chain_length <n>\n"); |
---|
2005 | (void) fprintf(vis_stderr, " n (default = 2)\n"); |
---|
2006 | (void) fprintf(vis_stderr, " set tfm_init_cache_size <n>\n"); |
---|
2007 | (void) fprintf(vis_stderr, " n (default = 1001)\n"); |
---|
2008 | (void) fprintf(vis_stderr, " set tfm_auto_flush_cache <m>\n"); |
---|
2009 | (void) fprintf(vis_stderr, " m = 0 : flush cache only when requested\n"); |
---|
2010 | (void) fprintf(vis_stderr, " m = 1 : flush cache at the end of image computation (default)\n"); |
---|
2011 | (void) fprintf(vis_stderr, " m = 2 : flush cache before reordering\n"); |
---|
2012 | (void) fprintf(vis_stderr, " set tfm_compose_intermediate_vars <m>\n"); |
---|
2013 | (void) fprintf(vis_stderr, " m = yes : compose all intermediate vars\n"); |
---|
2014 | (void) fprintf(vis_stderr, " m = no : do not compose (default)\n"); |
---|
2015 | (void) fprintf(vis_stderr, " set tfm_pre_split_method <m>\n"); |
---|
2016 | (void) fprintf(vis_stderr, " m = 0 : input splitting (domain cofactoring, default)\n"); |
---|
2017 | (void) fprintf(vis_stderr, " m = 1 : output splitting (constraint cofactoring)\n"); |
---|
2018 | (void) fprintf(vis_stderr, " m = 2 : mixed (input split + output split)\n"); |
---|
2019 | (void) fprintf(vis_stderr, " m = 3 : substitution\n"); |
---|
2020 | (void) fprintf(vis_stderr, " set tfm_pre_input_split <m>\n"); |
---|
2021 | (void) fprintf(vis_stderr, " m = 0 : support before splitting (default)\n"); |
---|
2022 | (void) fprintf(vis_stderr, " m = 1 : support after splitting\n"); |
---|
2023 | (void) fprintf(vis_stderr, " m = 2 : estimate BDD size after splitting\n"); |
---|
2024 | (void) fprintf(vis_stderr, " m = 3 : top variable\n"); |
---|
2025 | (void) fprintf(vis_stderr, " set tfm_pre_output_split <m>\n"); |
---|
2026 | (void) fprintf(vis_stderr, " m = 0 : smallest BDD size (default)\n"); |
---|
2027 | (void) fprintf(vis_stderr, " m = 1 : largest BDD size\n"); |
---|
2028 | (void) fprintf(vis_stderr, " m = 2 : top variable\n"); |
---|
2029 | (void) fprintf(vis_stderr, " set tfm_pre_dc_leaf_method <m>\n"); |
---|
2030 | (void) fprintf(vis_stderr, " m = 0 : substitution (default)\n"); |
---|
2031 | (void) fprintf(vis_stderr, " m = 1 : constraint cofactoring\n"); |
---|
2032 | (void) fprintf(vis_stderr, " m = 2 : hybrid\n"); |
---|
2033 | (void) fprintf(vis_stderr, " set tfm_pre_minimize <m>\n"); |
---|
2034 | (void) fprintf(vis_stderr, " m = yes : minimize function vector w.r.t. a chosen function\n"); |
---|
2035 | (void) fprintf(vis_stderr, " in constraint cofactoring\n"); |
---|
2036 | (void) fprintf(vis_stderr, " m = no : do not minimize (default)\n"); |
---|
2037 | (void) fprintf(vis_stderr, " set tfm_verbosity <n>\n"); |
---|
2038 | (void) fprintf(vis_stderr, " n = 0 - 2 (default = 0)\n"); |
---|
2039 | return 1; |
---|
2040 | } /* end of CommandPrintTfmOptions */ |
---|
2041 | |
---|
2042 | |
---|
2043 | /**Function******************************************************************** |
---|
2044 | |
---|
2045 | Synopsis [Implements the print_hybrid_options command.] |
---|
2046 | |
---|
2047 | CommandName [print_hybrid_options] |
---|
2048 | |
---|
2049 | CommandSynopsis [print information about the hybrid image computation options |
---|
2050 | currently in use] |
---|
2051 | |
---|
2052 | CommandArguments [\[-h\] \[-H\]] |
---|
2053 | |
---|
2054 | CommandDescription [Prints information about the current hybrid image |
---|
2055 | computation options. |
---|
2056 | <p> |
---|
2057 | |
---|
2058 | Command options: <p> |
---|
2059 | |
---|
2060 | <dl> |
---|
2061 | |
---|
2062 | <dt> -h |
---|
2063 | <dd> Print the command usage.<p> |
---|
2064 | |
---|
2065 | <dt> -H |
---|
2066 | <dd> Print the hybrid image computation set command usage.<p> |
---|
2067 | |
---|
2068 | </dl> |
---|
2069 | |
---|
2070 | Set parameters: The hybrid image computation options are specified with the |
---|
2071 | set command. |
---|
2072 | |
---|
2073 | <dl> |
---|
2074 | |
---|
2075 | <dt> hybrid_mode <code> <m><mode<m>> </code> |
---|
2076 | <dd> Specify a mode how to start hybrid computation. <p> |
---|
2077 | <dd> |
---|
2078 | <code> mode </code> must be one of the following: |
---|
2079 | <p> |
---|
2080 | |
---|
2081 | <code> 0 </code>: start with only transition function and build transition |
---|
2082 | relation on demand <p> |
---|
2083 | <code> 1 </code>: start with both transition function and relation (default) |
---|
2084 | <p> |
---|
2085 | <code> 2 </code>: start with only transition relation. Only this mode |
---|
2086 | can deal with nondeterminism.<p> |
---|
2087 | |
---|
2088 | <dt> hybrid_tr_split_method <code> <m><method<m>> </code> |
---|
2089 | <dd> Specify a method to choose a splitting variable in hybrid mode = 2. <p> |
---|
2090 | <dd> |
---|
2091 | <code> method </code> must be one of the following: |
---|
2092 | <p> |
---|
2093 | |
---|
2094 | <code> 0 </code>: use support (default) <p> |
---|
2095 | <code> 1 </code>: use estimate BDD size <p> |
---|
2096 | |
---|
2097 | <dt> hybrid_build_partial_tr <code> <m><method<m>> </code> |
---|
2098 | <dd> Specify whether to build full or partial transition relation in |
---|
2099 | hybrid mode = 2. |
---|
2100 | This option is used to use less memory. When we use partial transition |
---|
2101 | relation, for the variables excluded in the transition relation, we build |
---|
2102 | each bit transition relation on demand. When nondeterminism exists in |
---|
2103 | the circuit, this can not be used. |
---|
2104 | <dd> |
---|
2105 | <code> method </code> must be one of the following: |
---|
2106 | <p> |
---|
2107 | |
---|
2108 | <code> yes </code>: build partial transition relation <p> |
---|
2109 | <code> no </code>: build full transition relation (default) <p> |
---|
2110 | |
---|
2111 | <dt> hybrid_partial_num_vars <number> |
---|
2112 | <dd> Specify how many variables are going to be excluded in building |
---|
2113 | partial transition relation. The default is 8. <p> |
---|
2114 | |
---|
2115 | <dt> hybrid_partial_method <code> <m><method<m>> </code> |
---|
2116 | <dd> Specify a method to choose variables to be excluded in building |
---|
2117 | partial transition relation. <p> |
---|
2118 | <dd> |
---|
2119 | <code> method </code> must be one of the following: |
---|
2120 | <p> |
---|
2121 | |
---|
2122 | <code> 0 </code>: use BDD size (default) <p> |
---|
2123 | <code> 1 </code>: use support <p> |
---|
2124 | |
---|
2125 | <dt> hybrid_delayed_split <code> <m><method<m>> </code> |
---|
2126 | <dd> Specify a method whether to split transition relation immediately or |
---|
2127 | just all at once before AndExist. <p> |
---|
2128 | <dd> |
---|
2129 | <code> method </code> must be one of the following: |
---|
2130 | <p> |
---|
2131 | |
---|
2132 | <code> yes </code>: apply splitting to transition relation at once <p> |
---|
2133 | <code> no </code>: do not apply (default) <p> |
---|
2134 | |
---|
2135 | <dt> hybrid_split_min_depth <number> |
---|
2136 | <dd> Specify the minimum depth to apply dynamic hybrid method. If a depth |
---|
2137 | is smaller than this minimum depth, just split. The default is 1. <p> |
---|
2138 | |
---|
2139 | <dt> hybrid_split_max_depth <number> |
---|
2140 | <dd> Specify the maximum depth to apply dynamic hybrid method. If a depth |
---|
2141 | is bigger than this maximum depth, just conjoin. The default is 5. <p> |
---|
2142 | |
---|
2143 | <dt> hybrid_pre_split_min_depth <number> |
---|
2144 | <dd> Specify the minimum depth to apply dynamic hybrid method in preimage |
---|
2145 | computation. If a depth is smaller than this minimum depth, just split. |
---|
2146 | The default is 0. <p> |
---|
2147 | |
---|
2148 | <dt> hybrid_pre_split_max_depth <number> |
---|
2149 | <dd> Specify the maximum depth to apply dynamic hybrid method in preimage |
---|
2150 | computation. If a depth is bigger than this maximum depth, just conjoin. |
---|
2151 | The default is 4. <p> |
---|
2152 | |
---|
2153 | <dt> hybrid_lambda_threshold <number> |
---|
2154 | <dd> Specify a threshold in floating between 0.0 and 1.0 to determine |
---|
2155 | to split or to conjoin after computing variable lifetime lambda for |
---|
2156 | image computation. |
---|
2157 | If lambda is equal or smaller than this threshold, we conjoin. |
---|
2158 | Otherwise we split. The default is 0.6 <p> |
---|
2159 | |
---|
2160 | <dt> hybrid_pre_lambda_threshold <number> |
---|
2161 | <dd> Specify a threshold in floating between 0.0 and 1.0 to determine |
---|
2162 | to split or to conjoin after computing variable lifetime lambda for |
---|
2163 | preimage computation. |
---|
2164 | If lambda is equal or smaller than this threshold, we conjoin. |
---|
2165 | Otherwise we split. The default is 0.65 <p> |
---|
2166 | |
---|
2167 | <dt> hybrid_conjoin_vector_size <number> |
---|
2168 | <dd> If the number of components in transition function vector is equal or |
---|
2169 | smaller than this threshold, we just conjoin. This check is performed before |
---|
2170 | computing lambda. The default is 10. <p> |
---|
2171 | |
---|
2172 | <dt> hybrid_conjoin_relation_size <number> |
---|
2173 | <dd> If the number of clusters in transition relation is equal or smaller |
---|
2174 | than this threshold, we just conjoin. This check is performed before |
---|
2175 | computing lambda. The default is 2. <p> |
---|
2176 | |
---|
2177 | <dt> hybrid_conjoin_relation_bdd_size <number> |
---|
2178 | <dd> If the shared BDD size of transition relation is equal or smaller than |
---|
2179 | this threshold, we conjoin. This check is performed before computing lambda. |
---|
2180 | The default is 200. <p> |
---|
2181 | |
---|
2182 | <dt> hybrid_improve_lambda <number> |
---|
2183 | <dd> When variable lifetime lambda is bigger than lambda threshold, |
---|
2184 | if the difference between previous and current lambda is equal or smaller |
---|
2185 | than this threshold, then we conjoin. The default is 0.1. <p> |
---|
2186 | |
---|
2187 | <dt> hybrid_improve_vector_size <number> |
---|
2188 | <dd> When variable lifetime lambda is bigger than lambda threshold, |
---|
2189 | if the difference between the previous and current number of components |
---|
2190 | in transition function vector is equal or smaller than this threshold, |
---|
2191 | then we conjoin. The default is 3. <p> |
---|
2192 | |
---|
2193 | <dt> hybrid_improve_vector_bdd_size <number> |
---|
2194 | <dd> When variable lifetime lambda is bigger than lambda threshold, |
---|
2195 | if the difference between the previous and current shared BDD size of |
---|
2196 | transition function vector is equal or smaller than this threshold, |
---|
2197 | then we conjoin. The default is 30.0. <p> |
---|
2198 | |
---|
2199 | <dt> hybrid_decide_mode <code> <m><method<m>> </code> |
---|
2200 | <dd> Specify a method to decide whether to split or to conjoin. <p> |
---|
2201 | <dd> |
---|
2202 | <code> method </code> must be one of the following: |
---|
2203 | <p> |
---|
2204 | |
---|
2205 | <code> 0 </code>: use only lambda <p> |
---|
2206 | <code> 1 </code>: use lambda and also special checks to conjoin <p> |
---|
2207 | <code> 2 </code>: use lambda and also improvement <p> |
---|
2208 | <code> 3 </code>: use all (default) <p> |
---|
2209 | |
---|
2210 | <dt> hybrid_reorder_with_from <code> <m><method<m>> </code> |
---|
2211 | <dd> Specify a method to reorder transition relation to conjoin in image |
---|
2212 | computation, whether to include from set in the computation. <p> |
---|
2213 | <dd> |
---|
2214 | <code> method </code> must be one of the following: |
---|
2215 | <p> |
---|
2216 | |
---|
2217 | <code> yes </code>: reorder relation array with from to conjoin (default) <p> |
---|
2218 | <code> no </code>: reorder relation array without from to conjoin <p> |
---|
2219 | |
---|
2220 | <dt> hybrid_pre_reorder_with_from <code> <m><method<m>> </code> |
---|
2221 | <dd> Specify a method to reorder transition relation to conjoin in preimage |
---|
2222 | computation, whether to include from set in the computation. <p> |
---|
2223 | <dd> |
---|
2224 | <code> method </code> must be one of the following: |
---|
2225 | <p> |
---|
2226 | |
---|
2227 | <code> yes </code>: reorder relation array with from to conjoin <p> |
---|
2228 | <code> no </code>: reorder relation array without from to conjoin (default) |
---|
2229 | <p> |
---|
2230 | |
---|
2231 | <dt> hybrid_lambda_mode <code> <m><method<m>> </code> |
---|
2232 | <dd> Specify a method to decide which variable lifetime to be used for |
---|
2233 | image computation. <p> |
---|
2234 | <dd> |
---|
2235 | <code> method </code> must be one of the following: |
---|
2236 | <p> |
---|
2237 | |
---|
2238 | <code> 0 </code>: total lifetime with ps/pi variables (default) <p> |
---|
2239 | <code> 1 </code>: active lifetime with ps/pi variables <p> |
---|
2240 | <code> 2 </code>: total lifetime with ps/ns/pi variables <p> |
---|
2241 | |
---|
2242 | <dt> hybrid_pre_lambda_mode <code> <m><method<m>> </code> |
---|
2243 | <dd> Specify a method to decide which variable lifetime to be used for |
---|
2244 | preimage computation. <p> |
---|
2245 | <dd> |
---|
2246 | <code> method </code> must be one of the following: |
---|
2247 | <p> |
---|
2248 | |
---|
2249 | <code> 0 </code>: total lifetime with ns/pi variables <p> |
---|
2250 | <code> 1 </code>: active lifetime with ps/pi variables <p> |
---|
2251 | <code> 2 </code>: total lifetime with ps/ns/pi variables (default) <p> |
---|
2252 | <code> 3 </code>: total lifetime with ps/pi variables <p> |
---|
2253 | |
---|
2254 | <dt> hybrid_lambda_with_from <code> <m><method<m>> </code> |
---|
2255 | <dd> Specify a method to compute variable lifetime lambda, whether |
---|
2256 | to include from set in the computation. <p> |
---|
2257 | <dd> |
---|
2258 | <code> method </code> must be one of the following: |
---|
2259 | <p> |
---|
2260 | |
---|
2261 | <code> yes </code>: include from set in lambda computation (default) <p> |
---|
2262 | <code> no </code>: do not include <p> |
---|
2263 | |
---|
2264 | <dt> hybrid_lambda_with_tr <code> <m><method<m>> </code> |
---|
2265 | <dd> Specify a method to compute variable lifetime lambda, whether |
---|
2266 | to use transition relation or transition function vector, when both |
---|
2267 | exist. <p> |
---|
2268 | <dd> |
---|
2269 | <code> method </code> must be one of the following: |
---|
2270 | <p> |
---|
2271 | |
---|
2272 | <code> yes </code>: use transition relation (default) <p> |
---|
2273 | <code> no </code>: use transition function vector <p> |
---|
2274 | |
---|
2275 | <dt> hybrid_lambda_with_clustering <code> <m><method<m>> </code> |
---|
2276 | <dd> Specify a method whether to include clustering to compute variable |
---|
2277 | lifetime lambda. <p> |
---|
2278 | <dd> |
---|
2279 | <code> method </code> must be one of the following: |
---|
2280 | <p> |
---|
2281 | |
---|
2282 | <code> yes </code>: compute lambda after clustering <p> |
---|
2283 | <code> no </code>: do not cluster (default) <p> |
---|
2284 | |
---|
2285 | <dt> hybrid_synchronize_tr <code> <m><method<m>> </code> |
---|
2286 | <dd> Specify a method to keep transition relation. This option is only for |
---|
2287 | when hybrid mode is 1. <p> |
---|
2288 | <dd> |
---|
2289 | <code> method </code> must be one of the following: |
---|
2290 | <p> |
---|
2291 | |
---|
2292 | <code> yes </code>: rebuild transition relation from function vector |
---|
2293 | whenever the function vector changes <p> |
---|
2294 | <code> no </code>: do not rebuild (default) <p> |
---|
2295 | |
---|
2296 | <dt> hybrid_img_keep_pi <code> <m><method<m>> </code> |
---|
2297 | <dd> Specify a method to build forward transition relation. <p> |
---|
2298 | <dd> |
---|
2299 | <code> method </code> must be one of the following: |
---|
2300 | <p> |
---|
2301 | |
---|
2302 | <code> yes </code>: keep all primary input variables in forward transition |
---|
2303 | relation. <p> |
---|
2304 | <code> no </code>: quantify out local primary input variables from the |
---|
2305 | transition relation. (default) <p> |
---|
2306 | |
---|
2307 | <dt> hybrid_pre_keep_pi <code> <m><method<m>> </code> |
---|
2308 | <dd> Specify a method to build backward transition relation. <p> |
---|
2309 | <dd> |
---|
2310 | <code> method </code> must be one of the following: |
---|
2311 | <p> |
---|
2312 | |
---|
2313 | <code> yes </code>: keep all primary input variables in backward transition |
---|
2314 | relation and preimages. <p> |
---|
2315 | <code> no </code>: quantify out local primary input variables from the |
---|
2316 | transition relation. (default) <p> |
---|
2317 | |
---|
2318 | <dt> hybrid_pre_canonical <code> <m><method<m>> </code> |
---|
2319 | <dd> Specify a method whether to canonicalize the function vector for |
---|
2320 | preimage computation. <p> |
---|
2321 | <dd> |
---|
2322 | <code> method </code> must be one of the following: |
---|
2323 | <p> |
---|
2324 | |
---|
2325 | <code> yes </code>: canonicalize the function vector <p> |
---|
2326 | <code> no </code>: do not canonicalize (default) <p> |
---|
2327 | |
---|
2328 | <dt> hybrid_tr_method <code> <m>lt;method<m>gt; </code> |
---|
2329 | <dd> Specify an image method for AndExist operation in hybrid method. <p> |
---|
2330 | <dd> |
---|
2331 | <code> method </code> must be one of the following: |
---|
2332 | <p> |
---|
2333 | |
---|
2334 | <code> iwls95 (default) <p> |
---|
2335 | <code> mlp <p> |
---|
2336 | |
---|
2337 | </dl> |
---|
2338 | ] |
---|
2339 | |
---|
2340 | SideEffects [] |
---|
2341 | |
---|
2342 | ******************************************************************************/ |
---|
2343 | static int |
---|
2344 | CommandPrintHybridOptions(Hrc_Manager_t ** hmgr, int argc, char ** argv) |
---|
2345 | { |
---|
2346 | int c; |
---|
2347 | |
---|
2348 | if (*hmgr == NULL) { |
---|
2349 | fprintf(vis_stderr,"** hrc error: Hierarchy manager is empty\n"); |
---|
2350 | return 1; |
---|
2351 | } |
---|
2352 | |
---|
2353 | util_getopt_reset(); |
---|
2354 | while ((c = util_getopt(argc, argv, "hH")) != EOF) { |
---|
2355 | switch(c) { |
---|
2356 | case 'h': |
---|
2357 | goto usage; |
---|
2358 | case 'H': |
---|
2359 | goto usage_hybrid; |
---|
2360 | default: |
---|
2361 | goto usage; |
---|
2362 | } |
---|
2363 | } |
---|
2364 | |
---|
2365 | /* print hybrid image computation options */ |
---|
2366 | Img_PrintHybridOptions(); |
---|
2367 | return 0; |
---|
2368 | |
---|
2369 | usage: |
---|
2370 | (void) fprintf(vis_stderr,"usage: print_hybrid_options [-h] [-H]\n"); |
---|
2371 | (void) fprintf(vis_stderr, " -h print the command usage\n"); |
---|
2372 | (void) fprintf(vis_stderr, |
---|
2373 | " -H print the hybrid image computation set command usage\n"); |
---|
2374 | return 1; |
---|
2375 | usage_hybrid: |
---|
2376 | (void) fprintf(vis_stderr, " set hybrid_mode <m>\n"); |
---|
2377 | (void) fprintf(vis_stderr, " m = 0 : start with only transition function\n"); |
---|
2378 | (void) fprintf(vis_stderr, " m = 1 : start with both transition function and relation at the beginning (default)\n"); |
---|
2379 | (void) fprintf(vis_stderr, " m = 2 : start with only transition relation\n"); |
---|
2380 | (void) fprintf(vis_stderr, " set hybrid_tr_split_method <m>\n"); |
---|
2381 | (void) fprintf(vis_stderr, " m = 0 : use support (default)\n"); |
---|
2382 | (void) fprintf(vis_stderr, " m = 1 : use estimate BDD size\n"); |
---|
2383 | (void) fprintf(vis_stderr, " set hybrid_build_partial_tr <m>\n"); |
---|
2384 | (void) fprintf(vis_stderr, " m = yes : build partial transition relation\n"); |
---|
2385 | (void) fprintf(vis_stderr, " m = no : build full transition relation (default)\n"); |
---|
2386 | (void) fprintf(vis_stderr, " set hybrid_partial_num_vars <n>\n"); |
---|
2387 | (void) fprintf(vis_stderr, " n (default = 8)\n"); |
---|
2388 | (void) fprintf(vis_stderr, " set hybrid_partial_method <m>\n"); |
---|
2389 | (void) fprintf(vis_stderr, " m = 0 : use BDD size (default)\n"); |
---|
2390 | (void) fprintf(vis_stderr, " m = 1 : use support\n"); |
---|
2391 | (void) fprintf(vis_stderr, " set hybrid_delayed_split <m>\n"); |
---|
2392 | (void) fprintf(vis_stderr, " m = yes : apply splitting to transition relation at once\n"); |
---|
2393 | (void) fprintf(vis_stderr, " m = no : do not apply (default)\n"); |
---|
2394 | (void) fprintf(vis_stderr, " set hybrid_split_min_depth <n>\n"); |
---|
2395 | (void) fprintf(vis_stderr, " n (default = 1)\n"); |
---|
2396 | (void) fprintf(vis_stderr, " set hybrid_split_max_depth <n>\n"); |
---|
2397 | (void) fprintf(vis_stderr, " n (default = 5)\n"); |
---|
2398 | (void) fprintf(vis_stderr, " set hybrid_pre_split_min_depth <n>\n"); |
---|
2399 | (void) fprintf(vis_stderr, " n (default = 0)\n"); |
---|
2400 | (void) fprintf(vis_stderr, " set hybrid_pre_split_max_depth <n>\n"); |
---|
2401 | (void) fprintf(vis_stderr, " n (default = 4)\n"); |
---|
2402 | (void) fprintf(vis_stderr, " set hybrid_lambda_threshold <f>\n"); |
---|
2403 | (void) fprintf(vis_stderr, " f (default = 0.6)\n"); |
---|
2404 | (void) fprintf(vis_stderr, " set hybrid_pre_lambda_threshold <f>\n"); |
---|
2405 | (void) fprintf(vis_stderr, " f (default = 0.65)\n"); |
---|
2406 | (void) fprintf(vis_stderr, " set hybrid_conjoin_vector_size <n>\n"); |
---|
2407 | (void) fprintf(vis_stderr, " n (default = 10)\n"); |
---|
2408 | (void) fprintf(vis_stderr, " set hybrid_conjoin_relation_size <n>\n"); |
---|
2409 | (void) fprintf(vis_stderr, " n (default = 2)\n"); |
---|
2410 | (void) fprintf(vis_stderr, " set hybrid_conjoin_relation_bdd_size <n>\n"); |
---|
2411 | (void) fprintf(vis_stderr, " n (default = 200)\n"); |
---|
2412 | (void) fprintf(vis_stderr, " set hybrid_improve_lambda <f>\n"); |
---|
2413 | (void) fprintf(vis_stderr, " f (default = 0.1)\n"); |
---|
2414 | (void) fprintf(vis_stderr, " set hybrid_improve_vector_size <n>\n"); |
---|
2415 | (void) fprintf(vis_stderr, " n (default = 3)\n"); |
---|
2416 | (void) fprintf(vis_stderr, " set hybrid_improve_vector_bdd_size <f>\n"); |
---|
2417 | (void) fprintf(vis_stderr, " f (default = 30.0)\n"); |
---|
2418 | (void) fprintf(vis_stderr, " set hybrid_decide_mode <m>\n"); |
---|
2419 | (void) fprintf(vis_stderr, " m = 0 : use only lambda\n"); |
---|
2420 | (void) fprintf(vis_stderr, " m = 1 : use lambda and special checks\n"); |
---|
2421 | (void) fprintf(vis_stderr, " m = 2 : use lambda and improvement\n"); |
---|
2422 | (void) fprintf(vis_stderr, " m = 3 : use all (default)\n"); |
---|
2423 | (void) fprintf(vis_stderr, " set hybrid_reorder_with_from <m>\n"); |
---|
2424 | (void) fprintf(vis_stderr, " m = yes : include from set in reordering relation array (default)\n"); |
---|
2425 | (void) fprintf(vis_stderr, " m = no : do not include\n"); |
---|
2426 | (void) fprintf(vis_stderr, " set hybrid_pre_reorder_with_from <m>\n"); |
---|
2427 | (void) fprintf(vis_stderr, " m = yes : include from set in reordering relation array\n"); |
---|
2428 | (void) fprintf(vis_stderr, " m = no : do not include (default)\n"); |
---|
2429 | (void) fprintf(vis_stderr, " set hybrid_lambda_mode <m>\n"); |
---|
2430 | (void) fprintf(vis_stderr, " m = 0 : total lifetime with ps/pi variables (default)\n"); |
---|
2431 | (void) fprintf(vis_stderr, " m = 1 : active lifetime with ps/pi variables\n"); |
---|
2432 | (void) fprintf(vis_stderr, " m = 2 : total lifetime with ps/ns/pi variables\n"); |
---|
2433 | (void) fprintf(vis_stderr, " set hybrid_pre_lambda_mode <m>\n"); |
---|
2434 | (void) fprintf(vis_stderr, " m = 0 : total lifetime with ns/pi variables\n"); |
---|
2435 | (void) fprintf(vis_stderr, " m = 1 : active lifetime with ps/pi variables\n"); |
---|
2436 | (void) fprintf(vis_stderr, " m = 2 : total lifetime with ps/ns/pi variables (default)\n"); |
---|
2437 | (void) fprintf(vis_stderr, " m = 3 : total lifetime with ps/pi variables\n"); |
---|
2438 | (void) fprintf(vis_stderr, " set hybrid_lambda_with_from <m>\n"); |
---|
2439 | (void) fprintf(vis_stderr, " m = yes : include from set in lambda computation (default)\n"); |
---|
2440 | (void) fprintf(vis_stderr, " m = no : do not include\n"); |
---|
2441 | (void) fprintf(vis_stderr, " set hybrid_lambda_with_clustering <m>\n"); |
---|
2442 | (void) fprintf(vis_stderr, " m = yes : compute lambda after clustering\n"); |
---|
2443 | (void) fprintf(vis_stderr, " m = no : do not cluster (default)\n"); |
---|
2444 | (void) fprintf(vis_stderr, " set hybrid_synchronize_tr <m>\n"); |
---|
2445 | (void) fprintf(vis_stderr, " m = yes : rebuild transition relation whenever function vector changes\n"); |
---|
2446 | (void) fprintf(vis_stderr, " m = no : do not rebuild (default)\n"); |
---|
2447 | (void) fprintf(vis_stderr, " set hybrid_img_keep_pi <m>\n"); |
---|
2448 | (void) fprintf(vis_stderr, " m = yes : keep all pi variables in forward tr\n"); |
---|
2449 | (void) fprintf(vis_stderr, " m = no : quantify out local pi variables (default)\n"); |
---|
2450 | (void) fprintf(vis_stderr, " set hybrid_pre_keep_pi <m>\n"); |
---|
2451 | (void) fprintf(vis_stderr, " m = yes : keep all pi variables in backward tr and preimages\n"); |
---|
2452 | (void) fprintf(vis_stderr, " m = no : quantify out local pi variables (default)\n"); |
---|
2453 | (void) fprintf(vis_stderr, " set hybrid_pre_canonical <m>\n"); |
---|
2454 | (void) fprintf(vis_stderr, " m = yes : canonicalize the function vector for preimage\n"); |
---|
2455 | (void) fprintf(vis_stderr, " m = no : do not canonicalize (default)\n"); |
---|
2456 | (void) fprintf(vis_stderr, " set hybrid_tr_method <m>\n"); |
---|
2457 | (void) fprintf(vis_stderr, " m = iwls95 (default)\n"); |
---|
2458 | (void) fprintf(vis_stderr, " m = mlp\n"); |
---|
2459 | return 1; |
---|
2460 | } /* end of CommandPrintHybridOptions */ |
---|
2461 | |
---|
2462 | |
---|
2463 | /**Function******************************************************************** |
---|
2464 | |
---|
2465 | Synopsis [Implements the print_mlp_options command.] |
---|
2466 | |
---|
2467 | CommandName [print_mlp_options] |
---|
2468 | |
---|
2469 | CommandSynopsis [print information about the MLP image computation options |
---|
2470 | currently in use] |
---|
2471 | |
---|
2472 | CommandArguments [\[-h\] \[-H\]] |
---|
2473 | |
---|
2474 | CommandDescription [Prints information about the current MLP image |
---|
2475 | computation options. |
---|
2476 | <p> |
---|
2477 | |
---|
2478 | Command options: <p> |
---|
2479 | |
---|
2480 | <dl> |
---|
2481 | |
---|
2482 | <dt> -h |
---|
2483 | <dd> Print the command usage.<p> |
---|
2484 | |
---|
2485 | <dt> -H |
---|
2486 | <dd> Print the MLP image computation set command usage.<p> |
---|
2487 | |
---|
2488 | </dl> |
---|
2489 | |
---|
2490 | Set parameters: The MLP image computation options are specified with the |
---|
2491 | set command. |
---|
2492 | |
---|
2493 | <dl> |
---|
2494 | |
---|
2495 | <dt> mlp_cluster <code> <m><method<m>> </code> |
---|
2496 | <dd> Specify a method for clustering. <p> |
---|
2497 | <dd> |
---|
2498 | <code> method </code> must be one of the following: |
---|
2499 | <p> |
---|
2500 | |
---|
2501 | <code> 0 </code>: linear clustering <p> |
---|
2502 | <code> 1 </code>: affinity based tree clustering (default) <p> |
---|
2503 | |
---|
2504 | <dt> mlp_reorder <code> <m><method<m>> </code> |
---|
2505 | <dd> Specify a method for reordering after clustering for image |
---|
2506 | computation. <p> |
---|
2507 | <dd> |
---|
2508 | <code> method </code> must be one of the following: |
---|
2509 | <p> |
---|
2510 | |
---|
2511 | <code> 0 </code>: no reordering after clustering (default) <p> |
---|
2512 | <code> 1 </code>: reorder using MLP after clustering (inside) <p> |
---|
2513 | <code> 2 </code>: reorder using MLP after clustering (outside) <p> |
---|
2514 | <code> 3 </code>: reorder using IWLS95 after clustering <p> |
---|
2515 | |
---|
2516 | <dt> mlp_pre_reorder <code> <m><method<m>> </code> |
---|
2517 | <dd> Specify a method for reordering after clustering for preimage |
---|
2518 | computation. <p> |
---|
2519 | <dd> |
---|
2520 | <code> method </code> must be one of the following: |
---|
2521 | <p> |
---|
2522 | |
---|
2523 | <code> 0 </code>: no reordering after clustering (default) <p> |
---|
2524 | <code> 1 </code>: reorder using MLP after clustering (inside) <p> |
---|
2525 | <code> 2 </code>: reorder using MLP after clustering (outside) <p> |
---|
2526 | <code> 3 </code>: reorder using IWLS95 after clustering <p> |
---|
2527 | |
---|
2528 | <dt> mlp_postprocess <code> <m><method<m>> </code> |
---|
2529 | <dd> Specify when to do postprocessing. <p> |
---|
2530 | <dd> |
---|
2531 | <code> method </code> must be one of the following: |
---|
2532 | <p> |
---|
2533 | |
---|
2534 | <code> 0 </code>: no postprocessing (default) <p> |
---|
2535 | <code> 1 </code>: do postprocesing after ordering <p> |
---|
2536 | <code> 2 </code>: do postprocesing after clustering or reordering <p> |
---|
2537 | <code> 3 </code>: do both 1 and 2 <p> |
---|
2538 | |
---|
2539 | </dl> |
---|
2540 | ] |
---|
2541 | |
---|
2542 | SideEffects [] |
---|
2543 | |
---|
2544 | ******************************************************************************/ |
---|
2545 | static int |
---|
2546 | CommandPrintMlpOptions(Hrc_Manager_t ** hmgr, int argc, char ** argv) |
---|
2547 | { |
---|
2548 | int c; |
---|
2549 | |
---|
2550 | if (*hmgr == NULL) { |
---|
2551 | fprintf(vis_stderr,"** hrc error: Hierarchy manager is empty\n"); |
---|
2552 | return 1; |
---|
2553 | } |
---|
2554 | |
---|
2555 | util_getopt_reset(); |
---|
2556 | while ((c = util_getopt(argc, argv, "hH")) != EOF) { |
---|
2557 | switch(c) { |
---|
2558 | case 'h': |
---|
2559 | goto usage; |
---|
2560 | case 'H': |
---|
2561 | goto usage_mlp; |
---|
2562 | default: |
---|
2563 | goto usage; |
---|
2564 | } |
---|
2565 | } |
---|
2566 | |
---|
2567 | /* print hybrid image computation options */ |
---|
2568 | Img_PrintMlpOptions(); |
---|
2569 | return 0; |
---|
2570 | |
---|
2571 | usage: |
---|
2572 | (void) fprintf(vis_stderr,"usage: print_mlp_options [-h] [-H]\n"); |
---|
2573 | (void) fprintf(vis_stderr, " -h print the command usage\n"); |
---|
2574 | (void) fprintf(vis_stderr, |
---|
2575 | " -H print the MLP image computation set command usage\n"); |
---|
2576 | return 1; |
---|
2577 | usage_mlp: |
---|
2578 | (void) fprintf(vis_stderr, " set mlp_cluster <m>\n"); |
---|
2579 | (void) fprintf(vis_stderr, " m = 0 : linear clustering\n"); |
---|
2580 | (void) fprintf(vis_stderr, " m = 1 : affinity based tree clustering (default)\n"); |
---|
2581 | (void) fprintf(vis_stderr, " set mlp_reorder <m>\n"); |
---|
2582 | (void) fprintf(vis_stderr, " m = 0 : no reordering after clustering (default)\n"); |
---|
2583 | (void) fprintf(vis_stderr, " m = 1 : reorder using MLP after clustering (inside)\n"); |
---|
2584 | (void) fprintf(vis_stderr, " m = 2 : reorder using MLP after clustering (outside)\n"); |
---|
2585 | (void) fprintf(vis_stderr, " m = 3 : reorder using IWLS95 after clustering\n"); |
---|
2586 | (void) fprintf(vis_stderr, " set mlp_pre_reorder <m>\n"); |
---|
2587 | (void) fprintf(vis_stderr, " m = 0 : no reordering after clustering (default)\n"); |
---|
2588 | (void) fprintf(vis_stderr, " m = 1 : reorder using MLP after clustering (inside)\n"); |
---|
2589 | (void) fprintf(vis_stderr, " m = 2 : reorder using MLP after clustering (outside)\n"); |
---|
2590 | (void) fprintf(vis_stderr, " m = 3 : reorder using IWLS95 after clustering\n"); |
---|
2591 | (void) fprintf(vis_stderr, " set mlp_postprocess <m>\n"); |
---|
2592 | (void) fprintf(vis_stderr, " m = 0 : no postprocessing (default)\n"); |
---|
2593 | (void) fprintf(vis_stderr, " m = 1 : do postprocessing after ordering\n"); |
---|
2594 | (void) fprintf(vis_stderr, " m = 2 : do postprocessing after clustering or reordering\n"); |
---|
2595 | (void) fprintf(vis_stderr, " m = 3 : do both 1 and 2\n"); |
---|
2596 | return 1; |
---|
2597 | } /* end of CommandPrintMlpOptions */ |
---|
2598 | |
---|
2599 | |
---|
2600 | /**Function******************************************************************** |
---|
2601 | |
---|
2602 | Synopsis [Implements the print_guided_search_options command.] |
---|
2603 | |
---|
2604 | CommandName [print_guided_search_options] |
---|
2605 | |
---|
2606 | CommandSynopsis [print information about guided_search_options in use] |
---|
2607 | |
---|
2608 | CommandArguments [\[-h\] ] |
---|
2609 | |
---|
2610 | CommandDescription [Prints information about current Guided Search |
---|
2611 | options. Guided search is an alternate method to compute fixpoints |
---|
2612 | by modifying the fixpoint computation with restrictions. It is |
---|
2613 | applicable to the <tt>compute_reach</tt>, <tt>check_invariant</tt> |
---|
2614 | and <tt>model_check</tt> commands (refer to their help pages on the |
---|
2615 | use of guided search). See also for details: Ravi and Somenzi, Hints |
---|
2616 | to accelerate symbolic traversal. CHARME'99; Bloem, Ravi, and |
---|
2617 | Somenzi, Efficient Decision Procedures for Model Checking of Linear |
---|
2618 | Time Logic Properties, CAV'99; Bloem, Ravi, and Somenzi, Symbolic |
---|
2619 | Guided Search for CTL Model Checking, DAC'00. Not allowed with -A 2 |
---|
2620 | or -i, and will only work with iwls95 or monolithic image methods. |
---|
2621 | The description of some options can be found in the help page for |
---|
2622 | set. <p> |
---|
2623 | |
---|
2624 | Command options: <p> |
---|
2625 | |
---|
2626 | <dl> |
---|
2627 | <dt>guided_search_hint_type</dt> |
---|
2628 | |
---|
2629 | <dd>Choose from local (default) or global. If this flag is set to |
---|
2630 | local, then every subformula is evaluated to completion, using all |
---|
2631 | hints in order, before the next subformula is started. For pure ACTL |
---|
2632 | or pure ECTL formulae, we can also set guided_search_hint_type to |
---|
2633 | global, in which case the entire formula is evaluated for one hint |
---|
2634 | before moving on to the next hint, using underapproximations.</dd> |
---|
2635 | |
---|
2636 | <dt>guided_search_underapprox_minimize_method</dt> |
---|
2637 | |
---|
2638 | <dd>Choose from "constrain" and "and" (default). Sets the method with which |
---|
2639 | the transition relation is minimized when underapproximations are used. The |
---|
2640 | option constrain is incompatible with hints that use signals other than |
---|
2641 | inputs.</dd> |
---|
2642 | |
---|
2643 | <dt>guided_search_overapprox_minimize_method</dt> |
---|
2644 | |
---|
2645 | <dd>Choose from "squeeze" and "ornot" (default). Sets the method with which |
---|
2646 | the transition relation is minimized when underapproximations are used. The |
---|
2647 | option squeeze is incompatible with hints that use signals other than inputs. |
---|
2648 | Ornot implies that the transition relation will be disjoined with the |
---|
2649 | negation of the hint: T' = T + ~h, whereas squeeze will find a small BDD |
---|
2650 | between T and T'.</dd> |
---|
2651 | |
---|
2652 | <dt>guided_search_sequence</dt> |
---|
2653 | |
---|
2654 | <dd>For compute_reach and check_invariant only. Set this flag to a list of |
---|
2655 | comma-separated integers <code>i1,i2,...,in</code>, with <code>n</code> at |
---|
2656 | most the number of hints that you specify . The <code>k</code>'th hint will |
---|
2657 | be used for <code>ik</code> iterations (images). A value of <code>0</code> |
---|
2658 | causes the hint to be applied to convergence. Not setting this option is |
---|
2659 | like setting it to <code>0,0,...,0</code>. If length of the specified |
---|
2660 | sequence is less than the number of hints, the sequence is padded with |
---|
2661 | zeroes. |
---|
2662 | </dl> |
---|
2663 | |
---|
2664 | Guided search also uses the High Density traversal options that are |
---|
2665 | germane to dead-ends. The relevant flags are hd_dead_end, |
---|
2666 | hd_dead_end_approx_method, hd_frontier_approx_threshold, |
---|
2667 | hd_approx_quality, hd_approx_bias_quality. Use help on the |
---|
2668 | print_hd_options command for explanation of these flags. If guided |
---|
2669 | search is used with HD using the -A 1 options in |
---|
2670 | <tt>compute_reach</tt> and <tt>check_invariant</tt>, the HD options |
---|
2671 | are used by both HD and guided search. ] |
---|
2672 | |
---|
2673 | |
---|
2674 | SideEffects [] |
---|
2675 | |
---|
2676 | ******************************************************************************/ |
---|
2677 | static int |
---|
2678 | CommandPrintGuidedSearchOptions(Hrc_Manager_t ** hmgr, int argc, char ** argv) |
---|
2679 | { |
---|
2680 | int c; |
---|
2681 | if (*hmgr == NULL) { |
---|
2682 | fprintf(vis_stderr,"** hrc error: Hierarchy manager is empty\n"); |
---|
2683 | return 1; |
---|
2684 | } |
---|
2685 | |
---|
2686 | util_getopt_reset(); |
---|
2687 | while ((c = util_getopt(argc, argv, "h")) != EOF) { |
---|
2688 | switch(c) { |
---|
2689 | case 'h': |
---|
2690 | goto usage; |
---|
2691 | default: |
---|
2692 | goto usage; |
---|
2693 | } |
---|
2694 | /* NOT REACHED */ |
---|
2695 | } |
---|
2696 | |
---|
2697 | FsmGuidedSearchPrintOptions(); |
---|
2698 | return 0; |
---|
2699 | usage: |
---|
2700 | (void) fprintf(vis_stderr,"usage: print_guided_search_options [-h]\n"); |
---|
2701 | (void) fprintf(vis_stderr, " -h print the command usage\n"); |
---|
2702 | return 1; |
---|
2703 | |
---|
2704 | } /* end of CommandGuidedSearchPrintOptions */ |
---|
2705 | |
---|
2706 | |
---|
2707 | /**Function******************************************************************** |
---|
2708 | |
---|
2709 | Synopsis [Handle function for timeout.] |
---|
2710 | |
---|
2711 | Description [This function is called when the time out occurs.] |
---|
2712 | |
---|
2713 | SideEffects [] |
---|
2714 | |
---|
2715 | ******************************************************************************/ |
---|
2716 | static void |
---|
2717 | TimeOutHandle(void) |
---|
2718 | { |
---|
2719 | longjmp(timeOutEnv, 1); |
---|
2720 | } |
---|