[14] | 1 | /**CFile*********************************************************************** |
---|
| 2 | |
---|
| 3 | FileName [amcCmd.c] |
---|
| 4 | |
---|
| 5 | PackageName [amc] |
---|
| 6 | |
---|
| 7 | Synopsis [Command interface for the amc package.] |
---|
| 8 | |
---|
| 9 | Author [Woohyuk Lee <woohyuk@duke.colorado.edu>] |
---|
| 10 | |
---|
| 11 | Copyright [This file was created at the University of Colorado at Boulder. |
---|
| 12 | The University of Colorado at Boulder makes no warranty about the suitability |
---|
| 13 | of this software for any purpose. It is presented on an AS IS basis.] |
---|
| 14 | |
---|
| 15 | ******************************************************************************/ |
---|
| 16 | |
---|
| 17 | #include "amcInt.h" |
---|
| 18 | |
---|
| 19 | static char rcsid[] UNUSED = "$Id: amcCmd.c,v 1.44 2005/05/19 02:36:36 awedh Exp $"; |
---|
| 20 | |
---|
| 21 | |
---|
| 22 | /*---------------------------------------------------------------------------*/ |
---|
| 23 | /* Constant declarations */ |
---|
| 24 | /*---------------------------------------------------------------------------*/ |
---|
| 25 | |
---|
| 26 | /*---------------------------------------------------------------------------*/ |
---|
| 27 | /* Structure declarations */ |
---|
| 28 | /*---------------------------------------------------------------------------*/ |
---|
| 29 | |
---|
| 30 | /*---------------------------------------------------------------------------*/ |
---|
| 31 | /* Type declarations */ |
---|
| 32 | /*---------------------------------------------------------------------------*/ |
---|
| 33 | |
---|
| 34 | /*---------------------------------------------------------------------------*/ |
---|
| 35 | /* Variable declarations */ |
---|
| 36 | /*---------------------------------------------------------------------------*/ |
---|
| 37 | |
---|
| 38 | static jmp_buf timeOutEnv; |
---|
| 39 | |
---|
| 40 | /*---------------------------------------------------------------------------*/ |
---|
| 41 | /* Macro declarations */ |
---|
| 42 | /*---------------------------------------------------------------------------*/ |
---|
| 43 | |
---|
| 44 | /**AutomaticStart*************************************************************/ |
---|
| 45 | |
---|
| 46 | /*---------------------------------------------------------------------------*/ |
---|
| 47 | /* Static function prototypes */ |
---|
| 48 | /*---------------------------------------------------------------------------*/ |
---|
| 49 | |
---|
| 50 | static int CommandAmc(Hrc_Manager_t ** hmgr, int argc, char ** argv); |
---|
| 51 | static void ApproximateModelCheckUsage(void); |
---|
| 52 | static void TimeOutHandle(void); |
---|
| 53 | |
---|
| 54 | /**AutomaticEnd***************************************************************/ |
---|
| 55 | |
---|
| 56 | |
---|
| 57 | /*---------------------------------------------------------------------------*/ |
---|
| 58 | /* Definition of exported functions */ |
---|
| 59 | /*---------------------------------------------------------------------------*/ |
---|
| 60 | |
---|
| 61 | /**Function******************************************************************** |
---|
| 62 | |
---|
| 63 | Synopsis [Initializes the amc package.] |
---|
| 64 | |
---|
| 65 | SideEffects [] |
---|
| 66 | |
---|
| 67 | SeeAlso [Amc_End] |
---|
| 68 | |
---|
| 69 | ******************************************************************************/ |
---|
| 70 | void |
---|
| 71 | Amc_Init(void) |
---|
| 72 | { |
---|
| 73 | Cmd_CommandAdd("approximate_model_check", CommandAmc, 0); |
---|
| 74 | /* Cmd_CommandAdd("approximate_compute_reach", CommandApproxReach, 0); */ |
---|
| 75 | } |
---|
| 76 | |
---|
| 77 | |
---|
| 78 | /**Function******************************************************************** |
---|
| 79 | |
---|
| 80 | Synopsis [Ends the amc package.] |
---|
| 81 | |
---|
| 82 | SideEffects [] |
---|
| 83 | |
---|
| 84 | SeeAlso [Amc_Init] |
---|
| 85 | |
---|
| 86 | ******************************************************************************/ |
---|
| 87 | void |
---|
| 88 | Amc_End(void) |
---|
| 89 | { |
---|
| 90 | } |
---|
| 91 | |
---|
| 92 | |
---|
| 93 | /*---------------------------------------------------------------------------*/ |
---|
| 94 | /* Definition of internal functions */ |
---|
| 95 | /*---------------------------------------------------------------------------*/ |
---|
| 96 | |
---|
| 97 | |
---|
| 98 | /*---------------------------------------------------------------------------*/ |
---|
| 99 | /* Definition of static functions */ |
---|
| 100 | /*---------------------------------------------------------------------------*/ |
---|
| 101 | |
---|
| 102 | /**Function******************************************************************** |
---|
| 103 | |
---|
| 104 | Synopsis [The approximate_model_check command.] |
---|
| 105 | |
---|
| 106 | CommandName [approximate_model_check] |
---|
| 107 | |
---|
| 108 | CommandSynopsis [perform ACTL model checking on an abstracted |
---|
| 109 | and flattened network] |
---|
| 110 | |
---|
| 111 | CommandArguments [\[-h\] \[-v <verbosity_level>\] <ctl_file> ] |
---|
| 112 | |
---|
| 113 | CommandDescription [Performs ACTL model checking on an abstracted and |
---|
| 114 | flattened network. Predefined abstractions are performed prior to model |
---|
| 115 | checking. Before calling this command, the user should have initialized the |
---|
| 116 | design by calling the command <a href="init_verifyCmd.html"> <code> |
---|
| 117 | init_verify</code></a>. <p> |
---|
| 118 | |
---|
| 119 | The command includes two dual algorithms. The user should set appropriate |
---|
| 120 | environment parameters associated with the command to execute proper |
---|
| 121 | algorithm. By default, the command makes its effort to prove whether given |
---|
| 122 | ACTL formula is positive. To check whether the ACTL formula is negative, user |
---|
| 123 | should set the environment parameter <b>amc_prove_false</b> prior to |
---|
| 124 | executing the command. See <a href="#environment">below</a> for the |
---|
| 125 | environment parameters associated with this command. <p> |
---|
| 126 | |
---|
| 127 | Properties to be verified should be provided as ACTL formulas in the file |
---|
| 128 | <code><ctl_file></code>. The command only accepts ACTL formulas. |
---|
| 129 | Mixed, ECTL expressions are not supported. |
---|
| 130 | ACTL formulas are those in which all quantifiers are universal and |
---|
| 131 | negation is only allowed at the level of atomic propositions. |
---|
| 132 | For the precise syntax of CTL formulas, see the <a href="../ctl/ctl/ctl.html"> |
---|
| 133 | VIS CTL and LTL syntax manual</a>.<p> |
---|
| 134 | |
---|
| 135 | The command is designed to tackle the state explosion problem we encounter |
---|
| 136 | when dealing with large and complex circuits. Based on the initial size of |
---|
| 137 | the group, the command constructs over- or under-approximation of the |
---|
| 138 | transition relation of the system. A group (subsystem) is a portion of |
---|
| 139 | the original circuit containing a subset of the latches and |
---|
| 140 | their next state functions. The initial size of a group can be set with |
---|
| 141 | the <a href="#sizeofgroup">amc_sizeof_group</a> environment variable. |
---|
| 142 | These initial approximations may not contain every detail of the exact |
---|
| 143 | system. However they may contain enough information to |
---|
| 144 | determine whether the formula is positive or negative. Starting from an |
---|
| 145 | initial coarse approximation, the command makes its effort to prove whether |
---|
| 146 | given ACTL formula is positive or negative. When the procedure fails to prove |
---|
| 147 | correctness of the formula with initial approximations, it automatically |
---|
| 148 | refines the approximations. It repeats the process until the algorithm |
---|
| 149 | produces a reliable result or the available resources are exhausted.<p> |
---|
| 150 | |
---|
| 151 | Due to the overhead procedures, for some circuits, the exact <a |
---|
| 152 | href="model_checkCmd.html"><code>model_check</code> </a> method may evaluate |
---|
| 153 | formulas faster with less resources. If any formula evaluates to |
---|
| 154 | <em>false</em>, a debug trace is reported.<p> |
---|
| 155 | |
---|
| 156 | The command does not use fairness constraints even if they have been read |
---|
| 157 | with the <a href="read_fairnessCmd.html"><code>read_fairness</code></a> |
---|
| 158 | command. <p> |
---|
| 159 | |
---|
| 160 | |
---|
| 161 | <b>Command options: </b> |
---|
| 162 | <p> |
---|
| 163 | |
---|
| 164 | <dl> |
---|
| 165 | |
---|
| 166 | <dt><code> -h </code> |
---|
| 167 | <dd> Print the command usage. |
---|
| 168 | |
---|
| 169 | <p> |
---|
| 170 | |
---|
| 171 | <dt><code> -v <verbosity_level> </code> |
---|
| 172 | <dd> Specify verbosity level. <code> verbosity_level</code> must be one of |
---|
| 173 | the following: |
---|
| 174 | <p> |
---|
| 175 | |
---|
| 176 | <code> 0 </code> : No feedback provided. This is the default. <br> |
---|
| 177 | <code> 1 </code> : Some feedback. <br> |
---|
| 178 | <code> 2 </code> : Lots of feedback. |
---|
| 179 | <p> |
---|
| 180 | |
---|
| 181 | <dt> -t <code><timeOutPeriod></code> |
---|
| 182 | <dd> Specify the time out period (in seconds) after which the command |
---|
| 183 | aborts. By default this option is set to infinity. |
---|
| 184 | <p> |
---|
| 185 | |
---|
| 186 | <dt> <code> <ctl_file> </code> |
---|
| 187 | <dd> File containing ACTL formulas to be model checked. |
---|
| 188 | <p> |
---|
| 189 | |
---|
| 190 | </dl> |
---|
| 191 | |
---|
| 192 | <b><A NAME="environment">Environment Parameters:</A></b> |
---|
| 193 | <p> |
---|
| 194 | |
---|
| 195 | Environment parameters should be set using the set command |
---|
| 196 | from the VIS shell <br> |
---|
| 197 | (e.g. <code>vis\> set amc_prove_false</code>). |
---|
| 198 | |
---|
| 199 | <p> |
---|
| 200 | |
---|
| 201 | <dl> |
---|
| 202 | |
---|
| 203 | <dt> <b><code> amc_prove_false </code></b> |
---|
| 204 | <br> |
---|
| 205 | When the parameter is set, the command makes its effort to prove |
---|
| 206 | whether given ACTL formula is negative. The command constructs a set of |
---|
| 207 | under-approximations of the transition relations of the system. When |
---|
| 208 | the formula evaluates to <em>false</em>, a debug trace is reported by |
---|
| 209 | default. <p> |
---|
| 210 | |
---|
| 211 | <dt> <b><code> amc_grouping_method <grouping method> </code></b> |
---|
| 212 | <br> |
---|
| 213 | Specifies grouping method. Grouping method is a method for grouping |
---|
| 214 | number of latches into single subsystem. Two methods are supported. |
---|
| 215 | <p> |
---|
| 216 | <dd> <b>Grouping based on hierarchy<code>(default)</code></b> : The |
---|
| 217 | method groups latches based on the hierarchy of the system. |
---|
| 218 | Normally, complex circuits are designed in multiple |
---|
| 219 | processes. Furthermore, processes form a hierarchy. The method |
---|
| 220 | uses this information provided by the original design. When a |
---|
| 221 | design described in high level description language is transformed |
---|
| 222 | into low level BLIF format, the processes are transformed into |
---|
| 223 | subcircuits. The method groups those latches that are within same |
---|
| 224 | subcircuit.<p> |
---|
| 225 | |
---|
| 226 | <dd> <b>Grouping based on latch dependencies(latch_dependency)</b>: The |
---|
| 227 | method groups those latches |
---|
| 228 | that are closely related. Closely related latches are those who has |
---|
| 229 | many (transitive) connections between them. |
---|
| 230 | <p> |
---|
| 231 | |
---|
| 232 | When the parameter is not specified, the command by default uses |
---|
| 233 | hierarchical grouping method. |
---|
| 234 | <p> |
---|
| 235 | |
---|
| 236 | <dt> <b><A NAME="sizeofgroup"><code> amc_sizeof_group <integer value> </code></A></b> |
---|
| 237 | <br> |
---|
| 238 | Determines the number of latches in each group(subsystem). The default |
---|
| 239 | value is 8. The initial size of the subsystem determines the initial |
---|
| 240 | degree of approximations of the transition relations. There's no proven |
---|
| 241 | rule of setting the value. Some experimental results show that setting |
---|
| 242 | the value to about 5-20% of overall number of latches is |
---|
| 243 | reasonable(e.g. if the system contains 100 latches set the value to |
---|
| 244 | 5-20). However, the suggested range may not work well with some |
---|
| 245 | examples. <p> |
---|
| 246 | |
---|
| 247 | <dt> <b><code> amc_DC_level <integer value> </code></b> |
---|
| 248 | <br> |
---|
| 249 | Specifies don't care levels. Default level is 0. Absence of the |
---|
| 250 | parameter sets the amc_DC_level to 0. |
---|
| 251 | <br> |
---|
| 252 | amc_DC_level must be one of the following:<p> |
---|
| 253 | <dl> |
---|
| 254 | <dt><code>0</code>: No don't cares are used. This is the default.<br> |
---|
| 255 | <dt><code>1</code>: Use unreachable states as don't cares. <br> |
---|
| 256 | <dt><code>2</code>: Aggressively use DC's to simplify MDD's in model |
---|
| 257 | checking. <br> |
---|
| 258 | </dl> |
---|
| 259 | <p> |
---|
| 260 | |
---|
| 261 | Using don't cares may take more time for some examples since the |
---|
| 262 | approximate model checker computes the reachable states for each |
---|
| 263 | subsystem. For some large circuits it is undesirable to set don't care |
---|
| 264 | level. <p> |
---|
| 265 | |
---|
| 266 | <dt> Related "set" options: <p> |
---|
| 267 | <dt> ctl_change_bracket <yes/no> |
---|
| 268 | <dd> Vl2mv automatically converts "\[\]" to "<>" in node names, |
---|
| 269 | therefore CTL parser does the same thing. However, in some cases a user |
---|
| 270 | does not want to change node names in CTL parsing. Then, use this set |
---|
| 271 | option by giving "no". Default is "yes". |
---|
| 272 | <p> |
---|
| 273 | |
---|
| 274 | <dt> See also commands : model_check, incremental_ctl_verification <p> |
---|
| 275 | |
---|
| 276 | </dl> |
---|
| 277 | |
---|
| 278 | <b>Examples:</b> <br> |
---|
| 279 | Here are some example sequences of the VIS executions using the approximate |
---|
| 280 | model checker.<br> |
---|
| 281 | <p> |
---|
| 282 | |
---|
| 283 | <code> |
---|
| 284 | read_blif_mv abp/abp.mv <br> |
---|
| 285 | flatten_hierarchy <br> |
---|
| 286 | static_order <br> |
---|
| 287 | build_partition_mdds <br> |
---|
| 288 | set amc_sizeof_group 4 <br> |
---|
| 289 | approximate_model_check abp/abpt.ctl <br> |
---|
| 290 | time <br> |
---|
| 291 | quit <br> |
---|
| 292 | <p> |
---|
| 293 | |
---|
| 294 | read_blif_mv coherence/coherence.mv <br> |
---|
| 295 | flatten_hierarchy <br> |
---|
| 296 | static_order <br> |
---|
| 297 | build_partition_mdds <br> |
---|
| 298 | set amc_sizeof_group 8 <br> |
---|
| 299 | set amc_prove_false <br> |
---|
| 300 | set amc_DC_level 0 <br> |
---|
| 301 | approximate_model_check coherence/coherence2.ctl <br> |
---|
| 302 | time <br> |
---|
| 303 | quit <br> |
---|
| 304 | <p> |
---|
| 305 | |
---|
| 306 | |
---|
| 307 | The algorithm used by approximate_model_check is described in detail in |
---|
| 308 | <a href="ftp://vlsi.colorado.edu/pub/iccad96.ps"> |
---|
| 309 | ftp://vlsi.colorado.edu/pub/iccad96.ps</a> |
---|
| 310 | ] |
---|
| 311 | |
---|
| 312 | |
---|
| 313 | SideEffects [] |
---|
| 314 | |
---|
| 315 | ******************************************************************************/ |
---|
| 316 | static int |
---|
| 317 | CommandAmc( |
---|
| 318 | Hrc_Manager_t ** hmgr, |
---|
| 319 | int argc, |
---|
| 320 | char ** argv) |
---|
| 321 | { |
---|
| 322 | static int timeOutPeriod; /* CPU seconds allowed */ |
---|
| 323 | char *ctlFileName; /* Name of file containing formulas */ |
---|
| 324 | FILE *ctlFile; /* File to read the formulas from */ |
---|
| 325 | Ntk_Network_t *network; /* Pointer to the current network */ |
---|
| 326 | array_t *ctlFormulaArray; /* Array of read ctl formulas */ |
---|
| 327 | array_t *ctlNormalForm; /* Array of normal ctl formulas */ |
---|
| 328 | Ctlp_Formula_t *currentFormula; /* Formula being verified */ |
---|
| 329 | int c, i; |
---|
| 330 | Amc_VerbosityLevel verbosity; /* Verbosity level */ |
---|
| 331 | |
---|
| 332 | long initialTime; |
---|
| 333 | long finalTime; |
---|
| 334 | |
---|
| 335 | |
---|
| 336 | /* Initialize Default Values */ |
---|
| 337 | timeOutPeriod = 0; |
---|
| 338 | ctlFileName = NIL(char); |
---|
| 339 | verbosity = Amc_VerbosityNone_c; |
---|
| 340 | |
---|
| 341 | /* |
---|
| 342 | * Parse command line options. |
---|
| 343 | */ |
---|
| 344 | util_getopt_reset(); |
---|
| 345 | while ((c = util_getopt(argc, argv, "ht:v:")) != EOF) { |
---|
| 346 | switch(c) { |
---|
| 347 | case 'h': |
---|
| 348 | ApproximateModelCheckUsage(); |
---|
| 349 | return 1; |
---|
| 350 | case 't': |
---|
| 351 | timeOutPeriod = atoi(util_optarg); |
---|
| 352 | break; |
---|
| 353 | case 'v': |
---|
| 354 | verbosity = (Amc_VerbosityLevel) atoi(util_optarg); |
---|
| 355 | break; |
---|
| 356 | default: |
---|
| 357 | ApproximateModelCheckUsage(); |
---|
| 358 | return 1; |
---|
| 359 | } |
---|
| 360 | } |
---|
| 361 | |
---|
| 362 | /* Make sure the CTL file has been provided */ |
---|
| 363 | if (argc == util_optind) { |
---|
| 364 | ApproximateModelCheckUsage(); |
---|
| 365 | return 1; |
---|
| 366 | } |
---|
| 367 | else { |
---|
| 368 | ctlFileName = argv[util_optind]; |
---|
| 369 | } |
---|
| 370 | |
---|
| 371 | /* |
---|
| 372 | * Obtain the network from the hierarchy manager |
---|
| 373 | */ |
---|
| 374 | network = Ntk_HrcManagerReadCurrentNetwork(*hmgr); |
---|
| 375 | if (network == NIL(Ntk_Network_t)) { |
---|
| 376 | return 1; |
---|
| 377 | } |
---|
| 378 | /* |
---|
| 379 | * Check whether the fairness was read. |
---|
| 380 | */ |
---|
| 381 | { |
---|
| 382 | Fsm_Fsm_t *exactFsm = Fsm_NetworkReadOrCreateFsm(network); |
---|
| 383 | Fsm_Fairness_t *fairCons = Fsm_FsmReadFairnessConstraint(exactFsm); |
---|
| 384 | int numOfDisjuncts = Fsm_FairnessReadNumDisjuncts(fairCons); |
---|
| 385 | if (numOfDisjuncts > 1) { |
---|
| 386 | /* non-Buchi */ |
---|
| 387 | fprintf(vis_stdout, "** amc warning: Fairness Constraint is not supported.\n"); |
---|
| 388 | } |
---|
| 389 | else { |
---|
| 390 | int numOfConj = Fsm_FairnessReadNumConjunctsOfDisjunct(fairCons, 0); |
---|
| 391 | if (numOfConj > 1) { |
---|
| 392 | /* Buchi */ |
---|
| 393 | fprintf(vis_stdout, "** amc warning: Fairness Constraint is not supported.\n"); |
---|
| 394 | } |
---|
| 395 | } |
---|
| 396 | } |
---|
| 397 | |
---|
| 398 | /* |
---|
| 399 | * Read in the array of CTL formulas provided in ctlFileName |
---|
| 400 | */ |
---|
| 401 | ctlFile = Cmd_FileOpen(ctlFileName, "r", NIL(char *), 0); |
---|
| 402 | if (ctlFile == NIL(FILE)) { |
---|
| 403 | return 1; |
---|
| 404 | } |
---|
| 405 | ctlFormulaArray = Ctlp_FileParseFormulaArray(ctlFile); |
---|
| 406 | fclose(ctlFile); |
---|
| 407 | |
---|
| 408 | if (ctlFormulaArray == NIL(array_t)) { |
---|
| 409 | (void) fprintf(vis_stderr, "** amc error: Error while parsing ctl formulas in file.\n"); |
---|
| 410 | return 1; |
---|
| 411 | } |
---|
| 412 | |
---|
| 413 | ctlNormalForm = Ctlp_FormulaArrayConvertToExistentialFormTree(ctlFormulaArray); |
---|
| 414 | |
---|
| 415 | /* |
---|
| 416 | * Start the timer. |
---|
| 417 | */ |
---|
| 418 | if (timeOutPeriod > 0) { |
---|
| 419 | (void) signal(SIGALRM, (void (*)(int))TimeOutHandle); |
---|
| 420 | (void) alarm(timeOutPeriod); |
---|
| 421 | |
---|
| 422 | /* The second time setjmp is called, it returns here !!*/ |
---|
| 423 | if (setjmp(timeOutEnv) > 0) { |
---|
| 424 | (void) fprintf(vis_stdout, "# AMC: timeout ocurred after %d seconds.\n", |
---|
| 425 | timeOutPeriod); |
---|
| 426 | alarm(0); |
---|
| 427 | |
---|
| 428 | /* Note that there is a huge memory leak here. */ |
---|
| 429 | Ctlp_FormulaArrayFree(ctlFormulaArray); |
---|
| 430 | Ctlp_FormulaArrayFree(ctlNormalForm); |
---|
| 431 | return 1; |
---|
| 432 | } |
---|
| 433 | } |
---|
| 434 | |
---|
| 435 | |
---|
| 436 | /* |
---|
| 437 | * Loop over every CTL formula in the array |
---|
| 438 | */ |
---|
| 439 | arrayForEachItem(Ctlp_Formula_t *, ctlNormalForm, i, currentFormula) { |
---|
| 440 | boolean validFormula; |
---|
| 441 | |
---|
| 442 | validFormula = FormulaTestIsForallQuantifier(currentFormula); |
---|
| 443 | if (!validFormula) { |
---|
| 444 | fprintf(vis_stderr, "Formula "); |
---|
| 445 | Ctlp_FormulaPrint(vis_stderr, currentFormula); |
---|
| 446 | fprintf(vis_stderr, " is not a valid ACTL formula. Skipping it\n"); |
---|
| 447 | } |
---|
| 448 | else if (!Mc_FormulaStaticSemanticCheckOnNetwork(currentFormula, network, |
---|
| 449 | FALSE)) { |
---|
| 450 | (void) fprintf(vis_stdout, "\n** amc error: Error in parsing Atomic Formula:\n%s\n", error_string()); |
---|
| 451 | error_init(); |
---|
| 452 | Ctlp_FormulaFree( currentFormula ); |
---|
| 453 | continue; |
---|
| 454 | } |
---|
| 455 | else { |
---|
| 456 | error_init(); |
---|
| 457 | initialTime = util_cpu_time(); |
---|
| 458 | Amc_AmcEvaluateFormula(network, currentFormula, verbosity); |
---|
| 459 | finalTime = util_cpu_time(); |
---|
| 460 | if(verbosity == Amc_VerbosityVomit_c) { |
---|
| 461 | (void) fprintf(vis_stdout, "\n%-20s%10ld\n", "analysis time =", |
---|
| 462 | (finalTime - initialTime) / 1000); |
---|
| 463 | } |
---|
| 464 | fprintf(vis_stdout, "\n"); |
---|
| 465 | } |
---|
| 466 | |
---|
| 467 | } /* End of arrayForEachItem in ctlFormulaArray */ |
---|
| 468 | |
---|
| 469 | |
---|
| 470 | |
---|
| 471 | /* Deactivate the alarm */ |
---|
| 472 | alarm(0); |
---|
| 473 | |
---|
| 474 | |
---|
| 475 | /* Clean up */ |
---|
| 476 | Ctlp_FormulaArrayFree(ctlFormulaArray); |
---|
| 477 | Ctlp_FormulaArrayFree(ctlNormalForm); |
---|
| 478 | error_cleanup(); |
---|
| 479 | |
---|
| 480 | |
---|
| 481 | /* normal exit */ |
---|
| 482 | return 0; |
---|
| 483 | } |
---|
| 484 | |
---|
| 485 | /**Function******************************************************************** |
---|
| 486 | |
---|
| 487 | Synopsis [Prints the usage of the approximate_model_checking command.] |
---|
| 488 | |
---|
| 489 | SideEffects [] |
---|
| 490 | |
---|
| 491 | SeeAlso [CommandAmc] |
---|
| 492 | |
---|
| 493 | ******************************************************************************/ |
---|
| 494 | static void |
---|
| 495 | ApproximateModelCheckUsage(void) |
---|
| 496 | { |
---|
| 497 | (void) fprintf(vis_stderr, "usage: approximate_model_check [-h] "); |
---|
| 498 | (void) fprintf(vis_stderr, "[-t secs] [-v] ctlfile\n"); |
---|
| 499 | (void) fprintf(vis_stderr, " -h print the command usage\n"); |
---|
| 500 | (void) fprintf(vis_stderr, " -t secs Seconds allowed for computation\n"); |
---|
| 501 | (void) fprintf(vis_stderr, " -v number verbosity level\n"); |
---|
| 502 | (void) fprintf(vis_stderr, " ctlfile File containing the ctl formulas\n"); |
---|
| 503 | |
---|
| 504 | return; |
---|
| 505 | } /* End of ApproximateModelCheckUsage */ |
---|
| 506 | |
---|
| 507 | |
---|
| 508 | |
---|
| 509 | /**Function******************************************************************** |
---|
| 510 | |
---|
| 511 | Synopsis [Tests recursively if a formula is a valid ACTL formula.] |
---|
| 512 | |
---|
| 513 | Description [This function implements the recursive steps needed for the |
---|
| 514 | function FormulaTestIsForallQuantifier.] |
---|
| 515 | |
---|
| 516 | SideEffects [] |
---|
| 517 | |
---|
| 518 | SeeAlso [CommandAmc] |
---|
| 519 | |
---|
| 520 | ******************************************************************************/ |
---|
| 521 | boolean |
---|
| 522 | FormulaTestIsForallQuantifier( |
---|
| 523 | Ctlp_Formula_t *formula) |
---|
| 524 | { |
---|
| 525 | Ctlp_Formula_t *newFormula; |
---|
| 526 | boolean converted; |
---|
| 527 | Ctlp_FormulaClass result; |
---|
| 528 | |
---|
| 529 | if (!Ctlp_FormulaTestIsConverted(formula)) { |
---|
| 530 | newFormula = Ctlp_FormulaConvertToExistentialForm(formula); |
---|
| 531 | converted = TRUE; |
---|
| 532 | } |
---|
| 533 | else { |
---|
| 534 | newFormula = formula; |
---|
| 535 | converted = FALSE; |
---|
| 536 | } |
---|
| 537 | |
---|
| 538 | result = Ctlp_CheckClassOfExistentialFormula(newFormula); |
---|
| 539 | |
---|
| 540 | if (converted) { |
---|
| 541 | Ctlp_FormulaFree(newFormula); |
---|
| 542 | } /* End of if */ |
---|
| 543 | |
---|
| 544 | return result == Ctlp_ACTL_c || result == Ctlp_QuantifierFree_c; |
---|
| 545 | |
---|
| 546 | } /* End of FormulaTestIsForallQuantifier */ |
---|
| 547 | |
---|
| 548 | |
---|
| 549 | /**Function******************************************************************** |
---|
| 550 | |
---|
| 551 | Synopsis [Handle the timeout signal.] |
---|
| 552 | |
---|
| 553 | Description [This function is called when the time out occurs. In principle |
---|
| 554 | it could do something smarter, but so far it just transfers control to the |
---|
| 555 | point in the code where setjmp was called.] |
---|
| 556 | |
---|
| 557 | SideEffects [This function gains control at any point in the middle of the |
---|
| 558 | computation, therefore the memory allocated so far leaks.] |
---|
| 559 | |
---|
| 560 | ******************************************************************************/ |
---|
| 561 | static void |
---|
| 562 | TimeOutHandle(void) |
---|
| 563 | { |
---|
| 564 | longjmp(timeOutEnv, 1); |
---|
| 565 | } /* End of TimeOutHandle */ |
---|