1 | /**CFile*********************************************************************** |
---|
2 | |
---|
3 | FileName [mcDbg.c] |
---|
4 | |
---|
5 | PackageName [mc] |
---|
6 | |
---|
7 | Synopsis [Debugger for Fair CTL models] |
---|
8 | |
---|
9 | Author [Adnan Aziz, Tom Shiple, In-Ho Moon] |
---|
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 "mcInt.h" |
---|
33 | |
---|
34 | static char rcsid[] UNUSED = "$Id: mcDbg.c,v 1.43 2005/04/23 04:40:54 fabio Exp $"; |
---|
35 | |
---|
36 | /*---------------------------------------------------------------------------*/ |
---|
37 | /* Macro declarations */ |
---|
38 | /*---------------------------------------------------------------------------*/ |
---|
39 | |
---|
40 | |
---|
41 | /**AutomaticStart*************************************************************/ |
---|
42 | |
---|
43 | /*---------------------------------------------------------------------------*/ |
---|
44 | /* Static function prototypes */ |
---|
45 | /*---------------------------------------------------------------------------*/ |
---|
46 | |
---|
47 | static void DebugID(McOptions_t *options, Ctlp_Formula_t *aFormula, mdd_t *aState, Fsm_Fsm_t *modelFsm); |
---|
48 | static void DebugTrueFalse(Ctlp_Formula_t *aFormula, mdd_t *aState, Fsm_Fsm_t *modelFsm); |
---|
49 | static void DebugBoolean(McOptions_t *options, Ctlp_Formula_t *aFormula, mdd_t *aState, Fsm_Fsm_t *modelFsm, array_t *careSetArray); |
---|
50 | static McPath_t * DebugEX(Ctlp_Formula_t *aFormula, mdd_t *aState, Fsm_Fsm_t *modelFsm, array_t *careSetArray); |
---|
51 | static McPath_t * DebugEU(Ctlp_Formula_t *aFormula, mdd_t *aState, Fsm_Fsm_t *modelFsm, array_t *careSetArray); |
---|
52 | static McPath_t * DebugEG(Ctlp_Formula_t *aFormula, mdd_t *aState, Fsm_Fsm_t *modelFsm, array_t *careSetArray, McOptions_t *options); |
---|
53 | static void FsmStateDebugConvertedFormula(McOptions_t *options, Ctlp_Formula_t *ctlFormula, mdd_t *aState, Fsm_Fsm_t *modelFsm, array_t *careSetArray); |
---|
54 | static void FsmPathDebugFormula(McOptions_t *options, Ctlp_Formula_t *ctlFormula, Fsm_Fsm_t *modelFsm, McPath_t *witnessPath, array_t *careSetArray); |
---|
55 | static void FsmPathDebugEXFormula(McOptions_t *options, Ctlp_Formula_t *ctlFormula, Fsm_Fsm_t *modelFsm, McPath_t *witnessPath, array_t *careSetArray); |
---|
56 | static void FsmPathDebugEUFormula(McOptions_t *options, Ctlp_Formula_t *ctlFormula, Fsm_Fsm_t *modelFsm, McPath_t *witnessPath, array_t *careSetArray); |
---|
57 | static void FsmPathDebugEGFormula(McOptions_t *options, Ctlp_Formula_t *ctlFormula, Fsm_Fsm_t *modelFsm, McPath_t *witnessPath, array_t *careSetArray); |
---|
58 | static void FsmPathDebugEFFormula(McOptions_t *options, Ctlp_Formula_t *ctlFormula, Fsm_Fsm_t *modelFsm, McPath_t *witnessPath, array_t *careSetArray); |
---|
59 | static void FsmPathDebugAXFormula(McOptions_t *options, Ctlp_Formula_t *ctlFormula, Fsm_Fsm_t *modelFsm, McPath_t *counterExamplePath, array_t *careSetArray); |
---|
60 | static void FsmPathDebugAFFormula(McOptions_t *options, Ctlp_Formula_t *ctlFormula, Fsm_Fsm_t *modelFsm, McPath_t *counterExamplePath, array_t *careSetArray); |
---|
61 | static void FsmPathDebugAGFormula(McOptions_t *options, Ctlp_Formula_t *ctlFormula, Fsm_Fsm_t *modelFsm, McPath_t *counterExamplePath, array_t *careSetArray); |
---|
62 | static void FsmPathDebugAUFormula(McOptions_t *options, mdd_t *aState, Ctlp_Formula_t *ctlFormula, Fsm_Fsm_t *modelFsm, array_t *careSetArray); |
---|
63 | |
---|
64 | /**AutomaticEnd***************************************************************/ |
---|
65 | |
---|
66 | |
---|
67 | /*---------------------------------------------------------------------------*/ |
---|
68 | /* Definition of exported functions */ |
---|
69 | /*---------------------------------------------------------------------------*/ |
---|
70 | |
---|
71 | /*---------------------------------------------------------------------------*/ |
---|
72 | /* Definition of internal functions */ |
---|
73 | /*---------------------------------------------------------------------------*/ |
---|
74 | |
---|
75 | /**Function******************************************************************** |
---|
76 | |
---|
77 | Synopsis [Debug CTL formula in existential normal form] |
---|
78 | |
---|
79 | Description [Debug CTL formula in existential normal form. The extent to |
---|
80 | which debug information is generated is a function of options settings. |
---|
81 | |
---|
82 | The debugger works with ctlFormula, but uses the pointers back to |
---|
83 | the original formula that it was converted from, to give the user |
---|
84 | more sensible feedback. To do this, it relies on a specific |
---|
85 | translation: only EF, AU, AF, AG, and AX are converted. Hence, the |
---|
86 | only times that the converted bit is set, we have a conversion of |
---|
87 | one of these formulas, and the operator is either EU, or negation. |
---|
88 | in the latter case, we can conclude from the child of the negation |
---|
89 | what formula we converted from: EX means AX, EG means AF, EU means AG, |
---|
90 | and OR means AU. |
---|
91 | ] |
---|
92 | |
---|
93 | SideEffects [Affects vis_stdpipe] |
---|
94 | |
---|
95 | SeeAlso [Ctlp_FormulaConvertToExistentialForm] |
---|
96 | |
---|
97 | ******************************************************************************/ |
---|
98 | int |
---|
99 | McFsmDebugFormula( |
---|
100 | McOptions_t *options, |
---|
101 | Ctlp_Formula_t *ctlFormula, |
---|
102 | Fsm_Fsm_t *modelFsm, |
---|
103 | array_t *careSetArray) |
---|
104 | { |
---|
105 | mdd_t *modelInitialStates = Fsm_FsmComputeInitialStates(modelFsm); |
---|
106 | mdd_t *goodStates = Ctlp_FormulaObtainLatestApprox(ctlFormula); |
---|
107 | mdd_t *badStates = mdd_and(modelInitialStates, goodStates, 1, 0); |
---|
108 | mdd_t *witnessSuccState; |
---|
109 | FILE *debugFile = McOptionsReadDebugFile(options); |
---|
110 | FILE *oldStdOut; |
---|
111 | FILE *oldStdErr; |
---|
112 | extern FILE *vis_stdpipe; |
---|
113 | char *nrOfTracesString; |
---|
114 | int nrOfTraces; /* nr of debug traces that we output */ |
---|
115 | int i; /* counts debug traces */ |
---|
116 | |
---|
117 | mdd_free(modelInitialStates); |
---|
118 | |
---|
119 | oldStdOut = vis_stdout; |
---|
120 | oldStdErr = vis_stderr; |
---|
121 | |
---|
122 | nrOfTracesString = Cmd_FlagReadByName("nr_counterexamples"); |
---|
123 | if(nrOfTracesString == NIL(char)) |
---|
124 | nrOfTraces = 1; |
---|
125 | else |
---|
126 | nrOfTraces = atoi(nrOfTracesString); |
---|
127 | |
---|
128 | if (debugFile) { |
---|
129 | vis_stdpipe = debugFile; |
---|
130 | vis_stdout = vis_stdpipe; |
---|
131 | (void)fprintf(vis_stdpipe, "# MC: formula failed --- "); |
---|
132 | Ctlp_FormulaPrint(vis_stdpipe,Ctlp_FormulaReadOriginalFormula(ctlFormula)); |
---|
133 | (void)fprintf(vis_stdpipe, "\n"); |
---|
134 | } else if (McOptionsReadUseMore(options)){ |
---|
135 | vis_stdpipe = popen("more", "w"); |
---|
136 | vis_stdout = vis_stdpipe; |
---|
137 | vis_stderr = vis_stdpipe; |
---|
138 | } |
---|
139 | else |
---|
140 | vis_stdpipe = vis_stdout; |
---|
141 | |
---|
142 | for(i = 0; i < nrOfTraces; i++){ |
---|
143 | (void)fprintf(vis_stdout, "# MC: Calling debugger for trace %d\n", |
---|
144 | i+1); |
---|
145 | witnessSuccState = McComputeACloseState(badStates, goodStates, modelFsm); |
---|
146 | McFsmStateDebugFormula(options, ctlFormula, witnessSuccState, modelFsm, |
---|
147 | careSetArray); |
---|
148 | (void)fprintf(vis_stdout, "\n"); |
---|
149 | |
---|
150 | mdd_free(witnessSuccState); |
---|
151 | } |
---|
152 | mdd_free(badStates); |
---|
153 | mdd_free(goodStates); |
---|
154 | |
---|
155 | if (vis_stdout != oldStdOut && vis_stdout != debugFile) |
---|
156 | (void)pclose(vis_stdpipe); |
---|
157 | |
---|
158 | vis_stdout = oldStdOut; |
---|
159 | vis_stderr = oldStdErr; |
---|
160 | |
---|
161 | return 1; |
---|
162 | } |
---|
163 | |
---|
164 | /**Function******************************************************************** |
---|
165 | |
---|
166 | Synopsis [Debug CTL formula in existential normal form at state aState] |
---|
167 | |
---|
168 | Description [Debug CTL formula in existential normal form at state |
---|
169 | aState. Formula is assumed to have been CONVERTED to existential normal |
---|
170 | form.] |
---|
171 | |
---|
172 | SideEffects [] |
---|
173 | |
---|
174 | ******************************************************************************/ |
---|
175 | void |
---|
176 | McFsmStateDebugFormula( |
---|
177 | McOptions_t *options, |
---|
178 | Ctlp_Formula_t *ctlFormula, |
---|
179 | mdd_t *aState, |
---|
180 | Fsm_Fsm_t *modelFsm, |
---|
181 | array_t *careSetArray) |
---|
182 | { |
---|
183 | Ctlp_Formula_t *originalFormula; |
---|
184 | McDbgLevel debugLevel = McOptionsReadDbgLevel( options ); |
---|
185 | |
---|
186 | if ( ctlFormula == NIL(Ctlp_Formula_t) ) |
---|
187 | return; |
---|
188 | |
---|
189 | if ( Ctlp_FormulaTestIsConverted( ctlFormula ) ) { |
---|
190 | FsmStateDebugConvertedFormula(options, ctlFormula, aState, modelFsm, |
---|
191 | careSetArray); |
---|
192 | return; |
---|
193 | } |
---|
194 | |
---|
195 | originalFormula = Ctlp_FormulaReadOriginalFormula( ctlFormula ); |
---|
196 | |
---|
197 | switch ( Ctlp_FormulaReadType( ctlFormula ) ) { |
---|
198 | |
---|
199 | case Ctlp_ID_c : |
---|
200 | DebugID( options, ctlFormula, aState, modelFsm ); |
---|
201 | break; |
---|
202 | |
---|
203 | case Ctlp_TRUE_c: |
---|
204 | case Ctlp_FALSE_c: |
---|
205 | DebugTrueFalse( ctlFormula, aState, modelFsm ); |
---|
206 | break; |
---|
207 | |
---|
208 | case Ctlp_EQ_c: |
---|
209 | case Ctlp_XOR_c: |
---|
210 | case Ctlp_THEN_c: |
---|
211 | case Ctlp_NOT_c: |
---|
212 | case Ctlp_AND_c: |
---|
213 | case Ctlp_OR_c: |
---|
214 | DebugBoolean(options, ctlFormula, aState, modelFsm, careSetArray); |
---|
215 | break; |
---|
216 | |
---|
217 | case Ctlp_EX_c: |
---|
218 | case Ctlp_EU_c: |
---|
219 | case Ctlp_EG_c: |
---|
220 | if ( !McStateSatisfiesFormula( ctlFormula, aState ) ) { |
---|
221 | mdd_t *passStates = Ctlp_FormulaObtainLatestApprox(ctlFormula); |
---|
222 | mdd_t *closeState; |
---|
223 | Ntk_Network_t *modelNetwork = Fsm_FsmReadNetwork(modelFsm); |
---|
224 | array_t *PSVars = Fsm_FsmReadPresentStateVars(modelFsm); |
---|
225 | McStateFailsFormula(aState, originalFormula, debugLevel, modelFsm); |
---|
226 | if (mdd_is_tautology(passStates, 0)) { |
---|
227 | fprintf(vis_stdout, |
---|
228 | "--No state satisfies the formula\n"); |
---|
229 | mdd_free(passStates); |
---|
230 | break; |
---|
231 | } |
---|
232 | fprintf(vis_stdout, |
---|
233 | "--A simple counter example does not exist since it\n"); |
---|
234 | fprintf(vis_stdout, |
---|
235 | " requires generating all paths from the state\n"); |
---|
236 | fprintf(vis_stdout, |
---|
237 | "--A state at minimum distance satisfying the formula is\n"); |
---|
238 | closeState = McComputeACloseState(passStates, aState, modelFsm); |
---|
239 | mdd_free(passStates); |
---|
240 | Mc_MintermPrint(closeState, PSVars, modelNetwork); |
---|
241 | mdd_free(closeState); |
---|
242 | break; |
---|
243 | } |
---|
244 | else { |
---|
245 | McPath_t *witnessPath = NIL(McPath_t); |
---|
246 | if ( Ctlp_FormulaReadType( ctlFormula ) == Ctlp_EX_c ) { |
---|
247 | witnessPath = DebugEX(ctlFormula, aState, modelFsm, careSetArray); |
---|
248 | } |
---|
249 | else if ( Ctlp_FormulaReadType( ctlFormula ) == Ctlp_EU_c ) { |
---|
250 | witnessPath = DebugEU(ctlFormula, aState, modelFsm, careSetArray); |
---|
251 | } |
---|
252 | else { |
---|
253 | witnessPath = DebugEG(ctlFormula, aState, modelFsm, careSetArray, |
---|
254 | options); |
---|
255 | } |
---|
256 | |
---|
257 | FsmPathDebugFormula(options, ctlFormula, modelFsm, witnessPath, |
---|
258 | careSetArray); |
---|
259 | McPathFree( witnessPath ); |
---|
260 | } |
---|
261 | break; |
---|
262 | |
---|
263 | case Ctlp_Cmp_c: |
---|
264 | case Ctlp_Init_c: |
---|
265 | case Ctlp_FwdU_c: |
---|
266 | case Ctlp_FwdG_c: |
---|
267 | case Ctlp_EY_c: |
---|
268 | case Ctlp_EH_c: |
---|
269 | break; |
---|
270 | |
---|
271 | default: { |
---|
272 | fail("Bad switch in debugging normal formula\n"); |
---|
273 | } |
---|
274 | } |
---|
275 | } |
---|
276 | |
---|
277 | |
---|
278 | |
---|
279 | |
---|
280 | /**Function******************************************************************** |
---|
281 | |
---|
282 | Synopsis [Build fair path starting from aState, using given debug information.] |
---|
283 | |
---|
284 | Description [Build fair path starting from aState, using given array of |
---|
285 | onion rings. Each member of this array of onion rings is an array of rings |
---|
286 | of states leading to a fairness constraint. Function returns an McPath_t, |
---|
287 | which consists of a stem array which is a sequence of states, and a path |
---|
288 | array which is a sequence of states starting from the last state in stem |
---|
289 | array, leading back to a state existing in stem array. In this sense, it is |
---|
290 | confusing, since the "cycle" is not a true cycle (it just completes a |
---|
291 | cycle).] |
---|
292 | |
---|
293 | Comment [Proceed by building a path which passes through each fairness |
---|
294 | constraint. Then attempt to complete a cycle by seeing if a path can be |
---|
295 | found from the last state to the first state satisfying the first fairness |
---|
296 | constraint.] |
---|
297 | |
---|
298 | SideEffects [] |
---|
299 | |
---|
300 | ******************************************************************************/ |
---|
301 | McPath_t * |
---|
302 | McBuildFairPath( |
---|
303 | mdd_t *startState, |
---|
304 | mdd_t *invariantStates, |
---|
305 | array_t *arrayOfOnionRings, |
---|
306 | Fsm_Fsm_t *modelFsm, |
---|
307 | array_t *careSetArray, |
---|
308 | Mc_VerbosityLevel verbosity, |
---|
309 | Mc_DcLevel dcLevel, |
---|
310 | Mc_FwdBwdAnalysis fwdBwd ) |
---|
311 | { |
---|
312 | mdd_t *tmpState; |
---|
313 | mdd_t *lastState; |
---|
314 | mdd_t *rootState = mdd_dup( startState ); |
---|
315 | mdd_t *currentState = mdd_dup( rootState ); |
---|
316 | mdd_t *stemState = NIL(mdd_t); |
---|
317 | |
---|
318 | array_t *tmpStemArray; |
---|
319 | array_t *dupArrayOfOnionRings = array_dup( arrayOfOnionRings ); |
---|
320 | array_t *stemArray = array_alloc(mdd_t *, 0 ); |
---|
321 | array_t *cycleArray = NIL(array_t); |
---|
322 | McPath_t *fairPath; |
---|
323 | |
---|
324 | array_insert_last( mdd_t *, stemArray, currentState ); |
---|
325 | |
---|
326 | while ( array_n( dupArrayOfOnionRings ) > 0 ) { |
---|
327 | int index = McComputeOnionRingsWithClosestCore(currentState, |
---|
328 | dupArrayOfOnionRings, modelFsm); |
---|
329 | array_t *onionRingsWithClosestFairness = array_fetch(array_t *, |
---|
330 | dupArrayOfOnionRings, index); |
---|
331 | array_t *tmpArray = Mc_BuildPathToCore(currentState, |
---|
332 | onionRingsWithClosestFairness, |
---|
333 | modelFsm, McGreaterOrEqualZero_c); |
---|
334 | |
---|
335 | if ( stemState == NIL(mdd_t) ) { |
---|
336 | tmpState = array_fetch_last( mdd_t *, tmpArray ); |
---|
337 | stemState = mdd_dup( tmpState ); |
---|
338 | } |
---|
339 | |
---|
340 | tmpStemArray = McCreateMergedPath( stemArray, tmpArray ); |
---|
341 | McNormalizeBddPointer(stemArray); |
---|
342 | McNormalizeBddPointer(tmpArray); |
---|
343 | mdd_array_free( stemArray ); |
---|
344 | mdd_array_free( tmpArray ); |
---|
345 | stemArray = tmpStemArray; |
---|
346 | |
---|
347 | currentState = array_fetch_last( mdd_t *, stemArray ); |
---|
348 | |
---|
349 | tmpArray = McRemoveIndexedOnionRings( index, dupArrayOfOnionRings ); |
---|
350 | array_free( dupArrayOfOnionRings ); |
---|
351 | dupArrayOfOnionRings = tmpArray; |
---|
352 | } /* while onionrings left */ |
---|
353 | array_free( dupArrayOfOnionRings ); |
---|
354 | |
---|
355 | tmpState = GET_NORMAL_PT(array_fetch_last( mdd_t *, stemArray )); |
---|
356 | lastState = mdd_dup( tmpState ); |
---|
357 | |
---|
358 | cycleArray = Mc_CompletePath(lastState, stemState, invariantStates, modelFsm, |
---|
359 | careSetArray, verbosity, dcLevel, fwdBwd); |
---|
360 | |
---|
361 | if ( cycleArray != NIL(array_t) ) { |
---|
362 | mdd_free( lastState ); |
---|
363 | } |
---|
364 | else { |
---|
365 | McPath_t *tmpFairPath; |
---|
366 | array_t *tmpStemArray; |
---|
367 | |
---|
368 | /* |
---|
369 | * Get shortest path to lastState |
---|
370 | */ |
---|
371 | McNormalizeBddPointer(stemArray); |
---|
372 | mdd_array_free( stemArray ); |
---|
373 | if ( !mdd_equal( rootState, lastState ) ) { |
---|
374 | stemArray = Mc_CompletePath(rootState, lastState, invariantStates, |
---|
375 | modelFsm, careSetArray, verbosity, dcLevel, |
---|
376 | fwdBwd); |
---|
377 | } |
---|
378 | else { |
---|
379 | stemArray = array_alloc( mdd_t *, 0 ); |
---|
380 | tmpState = mdd_dup( rootState ); |
---|
381 | array_insert_last( mdd_t *, stemArray, tmpState ); |
---|
382 | } |
---|
383 | mdd_free( lastState ); |
---|
384 | |
---|
385 | tmpState = GET_NORMAL_PT(array_fetch_last( mdd_t *, stemArray )); |
---|
386 | lastState = mdd_dup( tmpState ); |
---|
387 | |
---|
388 | if ( mdd_equal( lastState, rootState ) ) { |
---|
389 | /* |
---|
390 | * Force a descent in the SCC DAG |
---|
391 | mdd_t *descendantState = McGetSuccessorInTarget(lastState, |
---|
392 | invariantStates, modelFsm); |
---|
393 | */ |
---|
394 | mdd_t *descendantState = McGetSuccessorInTargetAmongFairStates(lastState, |
---|
395 | invariantStates, arrayOfOnionRings, modelFsm); |
---|
396 | tmpFairPath = McBuildFairPath(descendantState, invariantStates, |
---|
397 | arrayOfOnionRings, modelFsm, |
---|
398 | careSetArray, |
---|
399 | verbosity, dcLevel, fwdBwd); |
---|
400 | tmpStemArray = McCreateJoinedPath(stemArray, |
---|
401 | McPathReadStemArray(tmpFairPath)); |
---|
402 | mdd_free( descendantState ); |
---|
403 | } |
---|
404 | else { |
---|
405 | tmpFairPath = McBuildFairPath(lastState, invariantStates, |
---|
406 | arrayOfOnionRings, modelFsm, |
---|
407 | careSetArray, |
---|
408 | verbosity, dcLevel, fwdBwd); |
---|
409 | tmpStemArray = McCreateMergedPath(stemArray, |
---|
410 | McPathReadStemArray(tmpFairPath)); |
---|
411 | } |
---|
412 | mdd_free( lastState ); |
---|
413 | McNormalizeBddPointer(stemArray); |
---|
414 | mdd_array_free( stemArray ); |
---|
415 | stemArray = tmpStemArray; |
---|
416 | |
---|
417 | cycleArray = McMddArrayDuplicateFAFW( McPathReadCycleArray( tmpFairPath ) ); |
---|
418 | |
---|
419 | McPathFree( tmpFairPath ); |
---|
420 | |
---|
421 | if(Fsm_FsmReadUniQuantifyInputCube(modelFsm)) { |
---|
422 | mdd_t *S = GET_NORMAL_PT(array_fetch(mdd_t *, stemArray, 0)); |
---|
423 | mdd_t *T = GET_NORMAL_PT(array_fetch(mdd_t *, stemArray, array_n(stemArray)-1)); |
---|
424 | array_t *forwardRings = Mc_BuildForwardRingsWithInvariants( |
---|
425 | S, T, invariantStates, modelFsm); |
---|
426 | tmpStemArray = Mc_BuildPathFromCoreFAFW( |
---|
427 | T, forwardRings, modelFsm, McGreaterOrEqualZero_c); |
---|
428 | McNormalizeBddPointer(stemArray); |
---|
429 | mdd_array_free(stemArray); |
---|
430 | mdd_array_free(forwardRings); |
---|
431 | stemArray = tmpStemArray; |
---|
432 | } |
---|
433 | } |
---|
434 | |
---|
435 | mdd_free( rootState ); |
---|
436 | mdd_free( stemState ); |
---|
437 | |
---|
438 | fairPath = McPathAlloc(); |
---|
439 | McPathSetStemArray( fairPath, stemArray ); |
---|
440 | McPathSetCycleArray( fairPath, cycleArray ); |
---|
441 | |
---|
442 | return fairPath; |
---|
443 | } |
---|
444 | |
---|
445 | |
---|
446 | /*---------------------------------------------------------------------------*/ |
---|
447 | /* Definition of static functions */ |
---|
448 | /*---------------------------------------------------------------------------*/ |
---|
449 | |
---|
450 | |
---|
451 | /**Function******************************************************************** |
---|
452 | |
---|
453 | Synopsis [Debug an Atomic Formula] |
---|
454 | |
---|
455 | Description [Debug an Atomic Formula. As per the semantics of fair CTL, a |
---|
456 | state satisfies an Atomic Formula just in case the given wire computes the |
---|
457 | appropriate Boolean function on that state as input. The state has to be |
---|
458 | fair; however we do NOT justify the fairness by printing a path to a fair |
---|
459 | cycle. THe user can achieve this effect by adding ANDing in a formula EG |
---|
460 | TRUE.] |
---|
461 | |
---|
462 | SideEffects [] |
---|
463 | |
---|
464 | ******************************************************************************/ |
---|
465 | static void |
---|
466 | DebugID( |
---|
467 | McOptions_t *options, |
---|
468 | Ctlp_Formula_t *aFormula, |
---|
469 | mdd_t *aState, |
---|
470 | Fsm_Fsm_t *modelFsm) |
---|
471 | { |
---|
472 | Ctlp_Formula_t *originalFormula = Ctlp_FormulaReadOriginalFormula(aFormula); |
---|
473 | McDbgLevel debugLevel = McOptionsReadDbgLevel( options ); |
---|
474 | |
---|
475 | if ( McStateSatisfiesFormula( aFormula, aState ) ) { |
---|
476 | McStatePassesFormula( aState, originalFormula, debugLevel, modelFsm ); |
---|
477 | } |
---|
478 | else { |
---|
479 | McStateFailsFormula( aState, originalFormula, debugLevel, modelFsm ); |
---|
480 | } |
---|
481 | } |
---|
482 | |
---|
483 | /**Function******************************************************************** |
---|
484 | |
---|
485 | Synopsis [Debug a TRUE/FALSE formula] |
---|
486 | |
---|
487 | SideEffects [] |
---|
488 | |
---|
489 | ******************************************************************************/ |
---|
490 | static void |
---|
491 | DebugTrueFalse( |
---|
492 | Ctlp_Formula_t *aFormula, |
---|
493 | mdd_t *aState, |
---|
494 | Fsm_Fsm_t *modelFsm) |
---|
495 | { |
---|
496 | fprintf(vis_stdout, "--Nothing to debug for %s\n", |
---|
497 | ((Ctlp_FormulaReadType(aFormula) == Ctlp_TRUE_c) ? "TRUE\n" : "FALSE\n")); |
---|
498 | } |
---|
499 | |
---|
500 | /**Function******************************************************************** |
---|
501 | |
---|
502 | Synopsis [Debug a Boolean formula] |
---|
503 | |
---|
504 | Desciption [Debug a Boolean formula. For Boolean formula built out of binary |
---|
505 | connective, we may debug only one branch, if say the formula is an AND and |
---|
506 | the left branch is fails.] |
---|
507 | |
---|
508 | SideEffects [] |
---|
509 | |
---|
510 | ******************************************************************************/ |
---|
511 | static void |
---|
512 | DebugBoolean( |
---|
513 | McOptions_t *options, |
---|
514 | Ctlp_Formula_t *aFormula, |
---|
515 | mdd_t *aState, |
---|
516 | Fsm_Fsm_t *modelFsm, |
---|
517 | array_t *careSetArray) |
---|
518 | { |
---|
519 | Ctlp_Formula_t *originalFormula = Ctlp_FormulaReadOriginalFormula(aFormula); |
---|
520 | Ctlp_Formula_t *lFormula = Ctlp_FormulaReadLeftChild( aFormula ); |
---|
521 | Ctlp_Formula_t *rFormula = Ctlp_FormulaReadRightChild( aFormula ); |
---|
522 | McDbgLevel debugLevel = McOptionsReadDbgLevel(options); |
---|
523 | |
---|
524 | if (McStateSatisfiesFormula(aFormula, aState)) { |
---|
525 | McStatePassesFormula(aState, originalFormula, debugLevel, modelFsm); |
---|
526 | } else { |
---|
527 | McStateFailsFormula(aState, originalFormula, debugLevel, modelFsm); |
---|
528 | } |
---|
529 | |
---|
530 | /* We always debug the first (left) child. */ |
---|
531 | McFsmStateDebugFormula(options, lFormula, aState, modelFsm, careSetArray); |
---|
532 | |
---|
533 | /* What we do for the second child depends on the type of the formula. |
---|
534 | * For Ctlp_AND_c, Ctlp_OR_c, Ctlp_THEN_c the right child may not be |
---|
535 | * needed. With early termination, the right child may not have the |
---|
536 | * information required to produce a counterexample; hence, its debugging |
---|
537 | * is not optional. (We may get incorrect answers.) |
---|
538 | */ |
---|
539 | if (Ctlp_FormulaReadType(aFormula) == Ctlp_AND_c) { |
---|
540 | /* If aFormula fails and aState does not satisfy lFormula |
---|
541 | * 1. The information about aState at the right child is not |
---|
542 | * necessarilty correct. (aState was a don't care state.) |
---|
543 | * 2. A counterexample to lFormula is a counterexample to |
---|
544 | * aFormula. |
---|
545 | * So, if aFormula fails, we should debug the right child only if |
---|
546 | * aState satisfies lFormula. |
---|
547 | * If, on the other hand, aFormula passes, then aState must satisfy |
---|
548 | * lFormula, and we need to witness both lFormula and rFormula. |
---|
549 | */ |
---|
550 | if (McStateSatisfiesFormula(lFormula, aState)) { |
---|
551 | McFsmStateDebugFormula(options, rFormula, aState, modelFsm, |
---|
552 | careSetArray); |
---|
553 | } |
---|
554 | } else if (Ctlp_FormulaReadType(aFormula) == Ctlp_OR_c) { |
---|
555 | /* if aFormula passes, we should debug the right child only if |
---|
556 | * aState does not satisfy lFormula. |
---|
557 | * If, on the other hand, aFormula fails, then aState may not satisfy |
---|
558 | * lFormula, and we need to produce counterexamples for both lFormula |
---|
559 | * and rFormula. |
---|
560 | */ |
---|
561 | if (!McStateSatisfiesFormula(lFormula, aState)) { |
---|
562 | McFsmStateDebugFormula(options, rFormula, aState, modelFsm, |
---|
563 | careSetArray); |
---|
564 | } |
---|
565 | } else if (Ctlp_FormulaReadType(aFormula) == Ctlp_THEN_c) { |
---|
566 | /* This case is like the OR, with the polarity of the left |
---|
567 | * left child reversed. |
---|
568 | */ |
---|
569 | if (McStateSatisfiesFormula(lFormula, aState)) { |
---|
570 | McFsmStateDebugFormula(options, rFormula, aState, modelFsm, |
---|
571 | careSetArray); |
---|
572 | } |
---|
573 | } else if (Ctlp_FormulaReadType(aFormula) != Ctlp_NOT_c) { |
---|
574 | /* For Ctlp_EQ_c and Ctlp_XOR_c both children must be debugged. */ |
---|
575 | McFsmStateDebugFormula(options, rFormula, aState, modelFsm, careSetArray); |
---|
576 | } |
---|
577 | } |
---|
578 | |
---|
579 | /**Function******************************************************************** |
---|
580 | |
---|
581 | Synopsis [Debug a formula of type EX.] |
---|
582 | |
---|
583 | Description [Debug a formula of type EX at specified state. It is assumed |
---|
584 | that aState satisfies the EX formula.] |
---|
585 | |
---|
586 | SideEffects [] |
---|
587 | |
---|
588 | ******************************************************************************/ |
---|
589 | static McPath_t * |
---|
590 | DebugEX( |
---|
591 | Ctlp_Formula_t *aFormula, |
---|
592 | mdd_t *aState, |
---|
593 | Fsm_Fsm_t *modelFsm, |
---|
594 | array_t *careSetArray) |
---|
595 | { |
---|
596 | mdd_t *aDupState = mdd_dup( aState ); |
---|
597 | mdd_t *aStateSuccs; |
---|
598 | mdd_t *statesSatisfyingLeftFormula; |
---|
599 | mdd_t *targetStates; |
---|
600 | mdd_t *witnessSuccState; |
---|
601 | Ctlp_Formula_t *lFormula; |
---|
602 | McPath_t *witnessPath = McPathAlloc(); |
---|
603 | array_t *stemArray = array_alloc( mdd_t *, 0 ); |
---|
604 | Img_ImageInfo_t * imageInfo = Fsm_FsmReadOrCreateImageInfo(modelFsm, 0, 1); |
---|
605 | |
---|
606 | /* |
---|
607 | * By using careSet here, can end up with unreachable successors |
---|
608 | */ |
---|
609 | aStateSuccs = Img_ImageInfoComputeImageWithDomainVars(imageInfo, |
---|
610 | aState, aState, careSetArray); |
---|
611 | |
---|
612 | lFormula = Ctlp_FormulaReadLeftChild( aFormula ); |
---|
613 | statesSatisfyingLeftFormula = Ctlp_FormulaObtainLatestApprox( lFormula ); |
---|
614 | |
---|
615 | targetStates = mdd_and( aStateSuccs, statesSatisfyingLeftFormula, 1, 1 ); |
---|
616 | mdd_free( aStateSuccs ); mdd_free( statesSatisfyingLeftFormula ); |
---|
617 | |
---|
618 | witnessSuccState = Mc_ComputeACloseState( targetStates, aState, modelFsm ); |
---|
619 | mdd_free( targetStates ); |
---|
620 | |
---|
621 | array_insert_last( mdd_t *, stemArray, aDupState ); |
---|
622 | array_insert_last( mdd_t *, stemArray, witnessSuccState ); |
---|
623 | |
---|
624 | McPathSetStemArray( witnessPath, stemArray ); |
---|
625 | |
---|
626 | return witnessPath; |
---|
627 | } |
---|
628 | |
---|
629 | /**Function******************************************************************** |
---|
630 | |
---|
631 | Synopsis [Debug a formula of type EU.] |
---|
632 | |
---|
633 | Description [Debug a formula of type EU at specified state. It is assumed that |
---|
634 | state fails formula.] |
---|
635 | |
---|
636 | SideEffects [] |
---|
637 | |
---|
638 | ******************************************************************************/ |
---|
639 | static McPath_t * |
---|
640 | DebugEU( |
---|
641 | Ctlp_Formula_t *aFormula, |
---|
642 | mdd_t *aState, |
---|
643 | Fsm_Fsm_t *modelFsm, |
---|
644 | array_t *careSetArray) |
---|
645 | { |
---|
646 | McPath_t *witnessPath = McPathAlloc(); |
---|
647 | array_t *OnionRings = (array_t *) Ctlp_FormulaReadDebugData( aFormula ); |
---|
648 | array_t *pathToCore = Mc_BuildPathToCore(aState, OnionRings, |
---|
649 | modelFsm, |
---|
650 | McGreaterOrEqualZero_c ); |
---|
651 | |
---|
652 | McPathSetStemArray( witnessPath, pathToCore ); |
---|
653 | |
---|
654 | return witnessPath; |
---|
655 | } |
---|
656 | |
---|
657 | /**Function******************************************************************** |
---|
658 | |
---|
659 | Synopsis [Debug a formula of type EG.] |
---|
660 | |
---|
661 | Description [Debug a formula of type EG at specified state. It is assumed |
---|
662 | that state fails formula. Refer to Clarke et al DAC 1995 for details of the |
---|
663 | algorithm.] |
---|
664 | |
---|
665 | SideEffects [] |
---|
666 | |
---|
667 | ******************************************************************************/ |
---|
668 | static McPath_t * |
---|
669 | DebugEG( |
---|
670 | Ctlp_Formula_t *aFormula, |
---|
671 | mdd_t *aState, |
---|
672 | Fsm_Fsm_t *modelFsm, |
---|
673 | array_t *careSetArray, |
---|
674 | McOptions_t *options) |
---|
675 | { |
---|
676 | array_t *arrayOfOnionRings = (array_t *) Ctlp_FormulaReadDebugData(aFormula); |
---|
677 | mdd_t *invariantMdd = Ctlp_FormulaObtainLatestApprox( aFormula ); |
---|
678 | McPath_t *fairPath = McBuildFairPath(aState, invariantMdd, arrayOfOnionRings, |
---|
679 | modelFsm, careSetArray, |
---|
680 | McOptionsReadVerbosityLevel(options), |
---|
681 | McOptionsReadDcLevel(options), |
---|
682 | McOptionsReadFwdBwd(options)); |
---|
683 | mdd_free( invariantMdd ); |
---|
684 | |
---|
685 | return fairPath; |
---|
686 | } |
---|
687 | |
---|
688 | |
---|
689 | /**Function******************************************************************** |
---|
690 | |
---|
691 | Synopsis [Debug a converted formula] |
---|
692 | |
---|
693 | Comment [There are five kinds of formula that are converted: EF, AU, AF, AG, |
---|
694 | AX. The Ctlp_Formula_t structure has a pointer back to the original formula |
---|
695 | (where one exists). For the non-trivial cases (AU, AF, AG, AX) if the |
---|
696 | formula is false, we create a counter example, i.e. a fair path which fails |
---|
697 | the property. The AG, AX, AF cases are simple; the AU case is tricky because |
---|
698 | this can be failed on two ways.] |
---|
699 | |
---|
700 | SideEffects [] |
---|
701 | |
---|
702 | ******************************************************************************/ |
---|
703 | static void |
---|
704 | FsmStateDebugConvertedFormula( |
---|
705 | McOptions_t *options, |
---|
706 | Ctlp_Formula_t *ctlFormula, |
---|
707 | mdd_t *aState, |
---|
708 | Fsm_Fsm_t *modelFsm, |
---|
709 | array_t *careSetArray) |
---|
710 | { |
---|
711 | McPath_t *witnessPath; |
---|
712 | McPath_t *counterExamplePath; |
---|
713 | |
---|
714 | Ctlp_Formula_t *originalFormula =Ctlp_FormulaReadOriginalFormula(ctlFormula); |
---|
715 | Ctlp_Formula_t *lFormula = Ctlp_FormulaReadLeftChild( ctlFormula ); |
---|
716 | McDbgLevel debugLevel = McOptionsReadDbgLevel( options ); |
---|
717 | |
---|
718 | if ( Ctlp_FormulaReadType( ctlFormula ) == Ctlp_EU_c ) { |
---|
719 | if ( !McStateSatisfiesFormula( ctlFormula, aState ) ) { |
---|
720 | mdd_t *passStates = Ctlp_FormulaObtainLatestApprox(ctlFormula); |
---|
721 | mdd_t *closeState; |
---|
722 | Ntk_Network_t *modelNetwork = Fsm_FsmReadNetwork(modelFsm); |
---|
723 | array_t *PSVars = Fsm_FsmReadPresentStateVars(modelFsm); |
---|
724 | McStateFailsFormula( aState, originalFormula, debugLevel, modelFsm ); |
---|
725 | if (mdd_is_tautology(passStates, 0)) { |
---|
726 | fprintf(vis_stdout, |
---|
727 | "--No state satisfies the formula\n"); |
---|
728 | } else { |
---|
729 | fprintf(vis_stdout, |
---|
730 | "\n--A simple counter example does not exist since it\n"); |
---|
731 | fprintf(vis_stdout, |
---|
732 | " requires generating all paths from the state\n"); |
---|
733 | fprintf(vis_stdout, |
---|
734 | "--A state at minimum distance satisfying the formula is\n"); |
---|
735 | closeState = McComputeACloseState(passStates, aState, modelFsm); |
---|
736 | Mc_MintermPrint(closeState, PSVars, modelNetwork); |
---|
737 | mdd_free(closeState); |
---|
738 | } |
---|
739 | mdd_free(passStates); |
---|
740 | } |
---|
741 | else { |
---|
742 | witnessPath = DebugEU(ctlFormula, aState, modelFsm, careSetArray); |
---|
743 | FsmPathDebugEFFormula(options, ctlFormula, modelFsm, witnessPath, |
---|
744 | careSetArray); |
---|
745 | McPathFree( witnessPath ); |
---|
746 | } |
---|
747 | return; |
---|
748 | } |
---|
749 | |
---|
750 | /* |
---|
751 | * The original formula must be an AX,AF,AG, or AU formula |
---|
752 | */ |
---|
753 | if ( McStateSatisfiesFormula( ctlFormula, aState ) ) { |
---|
754 | McStatePassesFormula( aState, originalFormula, debugLevel, modelFsm ); |
---|
755 | fprintf(vis_stdout, |
---|
756 | "--A simple witness does not exist since it requires\n"); |
---|
757 | fprintf(vis_stdout, " generating all paths from the state\n"); |
---|
758 | return; |
---|
759 | } |
---|
760 | |
---|
761 | switch ( Ctlp_FormulaReadType( lFormula ) ) { |
---|
762 | case Ctlp_EX_c: { |
---|
763 | counterExamplePath = DebugEX(lFormula, aState, modelFsm, careSetArray); |
---|
764 | FsmPathDebugAXFormula(options, ctlFormula, modelFsm, counterExamplePath, |
---|
765 | careSetArray); |
---|
766 | McPathFree( counterExamplePath ); |
---|
767 | break; |
---|
768 | } |
---|
769 | |
---|
770 | case Ctlp_EG_c: { |
---|
771 | counterExamplePath = DebugEG(lFormula, aState, modelFsm, careSetArray, |
---|
772 | options); |
---|
773 | FsmPathDebugAFFormula(options, ctlFormula, modelFsm, counterExamplePath, |
---|
774 | careSetArray); |
---|
775 | McPathFree( counterExamplePath ); |
---|
776 | break; |
---|
777 | } |
---|
778 | |
---|
779 | case Ctlp_EU_c: { |
---|
780 | counterExamplePath = DebugEU(lFormula, aState, modelFsm, careSetArray); |
---|
781 | FsmPathDebugAGFormula(options, ctlFormula, modelFsm, counterExamplePath, |
---|
782 | careSetArray); |
---|
783 | McPathFree( counterExamplePath ); |
---|
784 | break; |
---|
785 | } |
---|
786 | |
---|
787 | case Ctlp_OR_c: { |
---|
788 | /* |
---|
789 | * need special functions bcoz of two possibilities |
---|
790 | */ |
---|
791 | FsmPathDebugAUFormula(options, aState, ctlFormula, modelFsm, |
---|
792 | careSetArray); |
---|
793 | break; |
---|
794 | } |
---|
795 | |
---|
796 | default: fail("Bad formula type in handling converted operator\n"); |
---|
797 | } |
---|
798 | } |
---|
799 | |
---|
800 | |
---|
801 | /**Function******************************************************************** |
---|
802 | |
---|
803 | Synopsis [Debug a formula of the form EX, EG, EU, EF.] |
---|
804 | |
---|
805 | SideEffects [] |
---|
806 | |
---|
807 | ******************************************************************************/ |
---|
808 | static void |
---|
809 | FsmPathDebugFormula( |
---|
810 | McOptions_t *options, |
---|
811 | Ctlp_Formula_t *ctlFormula, |
---|
812 | Fsm_Fsm_t *modelFsm, |
---|
813 | McPath_t *witnessPath, |
---|
814 | array_t *careSetArray) |
---|
815 | { |
---|
816 | switch ( Ctlp_FormulaReadType( ctlFormula ) ) { |
---|
817 | case Ctlp_EX_c: { |
---|
818 | FsmPathDebugEXFormula(options, ctlFormula, modelFsm, witnessPath, |
---|
819 | careSetArray); |
---|
820 | break; |
---|
821 | } |
---|
822 | |
---|
823 | case Ctlp_EU_c: { |
---|
824 | FsmPathDebugEUFormula(options, ctlFormula, modelFsm, witnessPath, |
---|
825 | careSetArray); |
---|
826 | break; |
---|
827 | } |
---|
828 | |
---|
829 | case Ctlp_EG_c: { |
---|
830 | FsmPathDebugEGFormula(options, ctlFormula, modelFsm, witnessPath, |
---|
831 | careSetArray); |
---|
832 | break; |
---|
833 | } |
---|
834 | default: { |
---|
835 | fail("bad switch in converting converted formula\n"); |
---|
836 | } |
---|
837 | } |
---|
838 | } |
---|
839 | |
---|
840 | /**Function******************************************************************** |
---|
841 | |
---|
842 | Synopsis [Debug a path for EX type formula.] |
---|
843 | |
---|
844 | SideEffects [] |
---|
845 | |
---|
846 | ******************************************************************************/ |
---|
847 | static void |
---|
848 | FsmPathDebugEXFormula( |
---|
849 | McOptions_t *options, |
---|
850 | Ctlp_Formula_t *ctlFormula, |
---|
851 | Fsm_Fsm_t *modelFsm, |
---|
852 | McPath_t *witnessPath, |
---|
853 | array_t *careSetArray) |
---|
854 | { |
---|
855 | array_t *PSVars = Fsm_FsmReadPresentStateVars( modelFsm ); |
---|
856 | array_t *witnessArray = McPathReadStemArray( witnessPath ); |
---|
857 | mdd_t *firstState = array_fetch( mdd_t *, witnessArray, 0 ); |
---|
858 | char *firstStateName = Mc_MintermToString(firstState, PSVars, |
---|
859 | Fsm_FsmReadNetwork(modelFsm)); |
---|
860 | Ctlp_Formula_t *lChild = Ctlp_FormulaReadLeftChild( ctlFormula ); |
---|
861 | char *ctlFormulaText = Ctlp_FormulaConvertToString( ctlFormula ); |
---|
862 | boolean printInputs = McOptionsReadPrintInputs( options ); |
---|
863 | mdd_t *secondlastState; |
---|
864 | if(array_n(witnessArray)<2) |
---|
865 | { |
---|
866 | fprintf(vis_stdout,"witnessArray has less than two elements, return\n"); |
---|
867 | return; |
---|
868 | } |
---|
869 | secondlastState= array_fetch( mdd_t *, witnessArray, (array_n(witnessArray)-1) ); |
---|
870 | |
---|
871 | if( McOptionsReadDbgLevel( options ) == McDbgLevelMin_c) |
---|
872 | fprintf(vis_stdout, "--State\n%spasses EX formula\n\n", |
---|
873 | firstStateName); |
---|
874 | else |
---|
875 | fprintf(vis_stdout, "--State\n%spasses formula %s\n\n", firstStateName, |
---|
876 | ctlFormulaText ); |
---|
877 | |
---|
878 | FREE(firstStateName); |
---|
879 | FREE(ctlFormulaText); |
---|
880 | |
---|
881 | |
---|
882 | switch ( McOptionsReadDbgLevel( options ) ) { |
---|
883 | case McDbgLevelMin_c: |
---|
884 | case McDbgLevelMinVerbose_c: |
---|
885 | case McDbgLevelMax_c: |
---|
886 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
887 | Mc_PrintPath( witnessArray, modelFsm, printInputs ); |
---|
888 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
889 | McFsmStateDebugFormula(options, lChild, secondlastState, modelFsm, |
---|
890 | careSetArray); |
---|
891 | break; |
---|
892 | case McDbgLevelInteractive_c: |
---|
893 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
894 | Mc_PrintPath( witnessArray, modelFsm, printInputs ); |
---|
895 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
896 | if (McQueryContinue("Continue debugging EX formula? (1-yes,0-no)\n")) |
---|
897 | McFsmStateDebugFormula(options, lChild, secondlastState, modelFsm, |
---|
898 | careSetArray); |
---|
899 | break; |
---|
900 | default: |
---|
901 | fail("Reached bad switch in FsmPathDebugEXFormula\n"); |
---|
902 | } |
---|
903 | } |
---|
904 | |
---|
905 | /**Function******************************************************************** |
---|
906 | |
---|
907 | Synopsis [Debug a path for EU type formula.] |
---|
908 | |
---|
909 | SideEffects [] |
---|
910 | |
---|
911 | ******************************************************************************/ |
---|
912 | static void |
---|
913 | FsmPathDebugEUFormula( |
---|
914 | McOptions_t *options, |
---|
915 | Ctlp_Formula_t *ctlFormula, |
---|
916 | Fsm_Fsm_t *modelFsm, |
---|
917 | McPath_t *witnessPath, |
---|
918 | array_t *careSetArray) |
---|
919 | { |
---|
920 | char *ctlFormulaText = Ctlp_FormulaConvertToString( ctlFormula ); |
---|
921 | Ctlp_Formula_t *lFormula = Ctlp_FormulaReadLeftChild( ctlFormula ); |
---|
922 | Ctlp_Formula_t *rFormula = Ctlp_FormulaReadRightChild( ctlFormula ); |
---|
923 | char *lFormulaText = Ctlp_FormulaConvertToString( lFormula ); |
---|
924 | char *rFormulaText = Ctlp_FormulaConvertToString( rFormula ); |
---|
925 | array_t *PSVars = Fsm_FsmReadPresentStateVars( modelFsm ); |
---|
926 | array_t *witnessArray = McPathReadStemArray( witnessPath ); |
---|
927 | mdd_t *firstState = array_fetch( mdd_t *, witnessArray, 0 ); |
---|
928 | mdd_t *lastState = GET_NORMAL_PT(array_fetch_last( mdd_t *, witnessArray )); |
---|
929 | char *firstStateName = Mc_MintermToString(firstState, PSVars, |
---|
930 | Fsm_FsmReadNetwork(modelFsm)); |
---|
931 | McDbgLevel debugLevel = McOptionsReadDbgLevel( options ); |
---|
932 | boolean printInputs = McOptionsReadPrintInputs( options ); |
---|
933 | |
---|
934 | if( McOptionsReadDbgLevel( options ) == McDbgLevelMin_c) |
---|
935 | fprintf(vis_stdout, "--State\n%spasses EU formula\n\n", |
---|
936 | firstStateName); |
---|
937 | else |
---|
938 | fprintf(vis_stdout, "--State\n%spasses formula %s\n\n", firstStateName, |
---|
939 | ctlFormulaText ); |
---|
940 | |
---|
941 | FREE(firstStateName); |
---|
942 | FREE(ctlFormulaText); |
---|
943 | |
---|
944 | switch ( debugLevel ) { |
---|
945 | case McDbgLevelMin_c: |
---|
946 | case McDbgLevelMinVerbose_c: |
---|
947 | if ( array_n(witnessArray ) == 1 ) { |
---|
948 | if( debugLevel != McDbgLevelMin_c ) |
---|
949 | fprintf(vis_stdout, "since %s is true at this state", rFormulaText); |
---|
950 | McFsmStateDebugFormula(options, rFormula, lastState, modelFsm, |
---|
951 | careSetArray); |
---|
952 | } |
---|
953 | else { |
---|
954 | if( debugLevel != McDbgLevelMin_c ) |
---|
955 | fprintf(vis_stdout, "--Path on which %s is true till %s is true\n", |
---|
956 | lFormulaText, rFormulaText); |
---|
957 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
958 | Mc_PrintPath(witnessArray, modelFsm, printInputs); |
---|
959 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
960 | McFsmStateDebugFormula(options, rFormula, lastState, modelFsm, |
---|
961 | careSetArray); |
---|
962 | } |
---|
963 | break; |
---|
964 | case McDbgLevelMax_c: |
---|
965 | case McDbgLevelInteractive_c: |
---|
966 | if ( array_n(witnessArray ) == 1 ) { |
---|
967 | fprintf(vis_stdout, "since %s is true at this state", rFormulaText); |
---|
968 | McFsmStateDebugFormula(options, rFormula, lastState, modelFsm, |
---|
969 | careSetArray); |
---|
970 | } |
---|
971 | else { |
---|
972 | int i; |
---|
973 | fprintf(vis_stdout, "--Path on which %s is true till %s is true\n", |
---|
974 | lFormulaText, rFormulaText); |
---|
975 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
976 | Mc_PrintPath(witnessArray,modelFsm,printInputs); |
---|
977 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
978 | for( i=0 ; i < ( array_n( witnessArray ) - 1 ); i++ ) { |
---|
979 | mdd_t *aState = array_fetch( mdd_t *, witnessArray, i ); |
---|
980 | |
---|
981 | if (debugLevel == McDbgLevelMax_c || |
---|
982 | (debugLevel == McDbgLevelInteractive_c && |
---|
983 | McQueryContinue( |
---|
984 | "Continue debugging EU formula? (1-yes,0-no)\n"))) { |
---|
985 | McFsmStateDebugFormula(options, lFormula, aState, modelFsm, |
---|
986 | careSetArray); |
---|
987 | } |
---|
988 | } |
---|
989 | McFsmStateDebugFormula(options, rFormula, lastState, modelFsm, |
---|
990 | careSetArray); |
---|
991 | } |
---|
992 | break; |
---|
993 | default: |
---|
994 | fail("Should not be here - bad switch in debugging EU formula\n"); |
---|
995 | } |
---|
996 | FREE(lFormulaText); |
---|
997 | FREE(rFormulaText); |
---|
998 | } |
---|
999 | /**Function******************************************************************** |
---|
1000 | |
---|
1001 | Synopsis [Debug a path for EG type formula.] |
---|
1002 | |
---|
1003 | SideEffects [] |
---|
1004 | |
---|
1005 | ******************************************************************************/ |
---|
1006 | static void |
---|
1007 | FsmPathDebugEGFormula( |
---|
1008 | McOptions_t *options, |
---|
1009 | Ctlp_Formula_t *ctlFormula, |
---|
1010 | Fsm_Fsm_t *modelFsm, |
---|
1011 | McPath_t *witnessPath, |
---|
1012 | array_t *careSetArray) |
---|
1013 | { |
---|
1014 | mdd_t *firstState; |
---|
1015 | char *firstStateName; |
---|
1016 | array_t *witnessArray; |
---|
1017 | char *ctlFormulaText = Ctlp_FormulaConvertToString( ctlFormula ); |
---|
1018 | array_t *PSVars = Fsm_FsmReadPresentStateVars( modelFsm ); |
---|
1019 | array_t *stemArray = McPathReadStemArray( witnessPath ); |
---|
1020 | array_t *cycleArray = McPathReadCycleArray( witnessPath ); |
---|
1021 | Ctlp_Formula_t *lFormula = Ctlp_FormulaReadLeftChild( ctlFormula ); |
---|
1022 | char *lFormulaText = Ctlp_FormulaConvertToString( lFormula ); |
---|
1023 | McDbgLevel debugLevel = McOptionsReadDbgLevel( options ); |
---|
1024 | boolean printInputs = McOptionsReadPrintInputs( options ); |
---|
1025 | |
---|
1026 | witnessArray = McCreateMergedPath( stemArray, cycleArray ); |
---|
1027 | firstState = array_fetch( mdd_t *, witnessArray, 0 ); |
---|
1028 | firstStateName = Mc_MintermToString(firstState, PSVars,Fsm_FsmReadNetwork(modelFsm)); |
---|
1029 | |
---|
1030 | if( McOptionsReadDbgLevel( options ) == McDbgLevelMin_c) |
---|
1031 | fprintf(vis_stdout, "--State\n%spasses EG formula\n\n", |
---|
1032 | firstStateName); |
---|
1033 | else |
---|
1034 | fprintf(vis_stdout, "--State\n%spasses formula %s\n\n", firstStateName, |
---|
1035 | ctlFormulaText ); |
---|
1036 | |
---|
1037 | FREE(firstStateName); |
---|
1038 | FREE(ctlFormulaText); |
---|
1039 | |
---|
1040 | switch ( debugLevel ) { |
---|
1041 | case McDbgLevelMin_c: |
---|
1042 | case McDbgLevelMinVerbose_c: { |
---|
1043 | McPath_t *normalPath = McPathNormalize( witnessPath ); |
---|
1044 | array_t *stem = McPathReadStemArray( normalPath ); |
---|
1045 | array_t *cycle = McPathReadCycleArray( normalPath ); |
---|
1046 | |
---|
1047 | if(debugLevel != McDbgLevelMin_c) |
---|
1048 | fprintf(vis_stdout, "--Witness is a fair path where %s is always true\n", |
---|
1049 | lFormulaText); |
---|
1050 | |
---|
1051 | FREE( lFormulaText ); |
---|
1052 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1053 | (void) fprintf( vis_stdout, "--Fair path stem:\n"); |
---|
1054 | Mc_PrintPath( stem, modelFsm, printInputs ); |
---|
1055 | |
---|
1056 | (void) fprintf( vis_stdout, "--Fair path cycle:\n"); |
---|
1057 | Mc_PrintPath( cycle, modelFsm, printInputs ); |
---|
1058 | fprintf(vis_stdout, "\n"); |
---|
1059 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1060 | McPathFree( normalPath ); |
---|
1061 | break; |
---|
1062 | } |
---|
1063 | case McDbgLevelMax_c: |
---|
1064 | case McDbgLevelInteractive_c: { |
---|
1065 | McPath_t *normalPath = McPathNormalize( witnessPath ); |
---|
1066 | array_t *stem = McPathReadStemArray( normalPath ); |
---|
1067 | array_t *cycle = McPathReadCycleArray( normalPath ); |
---|
1068 | int i; |
---|
1069 | fprintf(vis_stdout, "--Witness is a fair path where %s is always true\n", |
---|
1070 | lFormulaText); |
---|
1071 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1072 | (void) fprintf( vis_stdout, "--Fair path stem:\n"); |
---|
1073 | Mc_PrintPath( stem, modelFsm, printInputs ); |
---|
1074 | (void) fprintf( vis_stdout, "--Fair path cycle:\n"); |
---|
1075 | Mc_PrintPath( cycle, modelFsm, printInputs ); |
---|
1076 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1077 | for( i=0 ; i < ( array_n( witnessArray )-1 ); i++ ) { |
---|
1078 | mdd_t *aState = array_fetch( mdd_t *, witnessArray, i ); |
---|
1079 | |
---|
1080 | if (debugLevel == McDbgLevelMax_c || |
---|
1081 | (debugLevel == McDbgLevelInteractive_c && |
---|
1082 | McQueryContinue( |
---|
1083 | "--Continue debugging EG formula? (1-yes,0-no)\n"))) { |
---|
1084 | McFsmStateDebugFormula(options, lFormula, aState, modelFsm, |
---|
1085 | careSetArray); |
---|
1086 | } |
---|
1087 | } |
---|
1088 | break; |
---|
1089 | } |
---|
1090 | default: |
---|
1091 | fail("Bad switch in FsmPathDebugEGFormula\n"); |
---|
1092 | } |
---|
1093 | McNormalizeBddPointer(witnessArray); |
---|
1094 | mdd_array_free( witnessArray ); |
---|
1095 | } |
---|
1096 | |
---|
1097 | /**Function******************************************************************** |
---|
1098 | |
---|
1099 | Synopsis [Debug a EF formula] |
---|
1100 | |
---|
1101 | SideEffects [] |
---|
1102 | |
---|
1103 | ******************************************************************************/ |
---|
1104 | static void |
---|
1105 | FsmPathDebugEFFormula( |
---|
1106 | McOptions_t *options, |
---|
1107 | Ctlp_Formula_t *ctlFormula, |
---|
1108 | Fsm_Fsm_t *modelFsm, |
---|
1109 | McPath_t *witnessPath, |
---|
1110 | array_t *careSetArray) |
---|
1111 | { |
---|
1112 | Ctlp_Formula_t *originalFormula = Ctlp_FormulaReadOriginalFormula(ctlFormula); |
---|
1113 | char *originalFormulaText = Ctlp_FormulaConvertToString( originalFormula ); |
---|
1114 | |
---|
1115 | array_t *PSVars = Fsm_FsmReadPresentStateVars( modelFsm ); |
---|
1116 | array_t *witnessArray = McPathReadStemArray( witnessPath ); |
---|
1117 | |
---|
1118 | mdd_t *firstState = array_fetch( mdd_t *, witnessArray, 0 ); |
---|
1119 | mdd_t *lastState = array_fetch_last( mdd_t *, witnessArray ); |
---|
1120 | char *firstStateName = Mc_MintermToString(firstState, PSVars, |
---|
1121 | Fsm_FsmReadNetwork(modelFsm)); |
---|
1122 | |
---|
1123 | Ctlp_Formula_t *rFormula = Ctlp_FormulaReadRightChild( ctlFormula ); |
---|
1124 | Ctlp_Formula_t *rOriginalFormula = Ctlp_FormulaReadOriginalFormula(rFormula); |
---|
1125 | char *rOriginalFormulaText = Ctlp_FormulaConvertToString( rOriginalFormula ); |
---|
1126 | char *rFormulaText = Ctlp_FormulaConvertToString( rFormula ); |
---|
1127 | McDbgLevel debugLevel = McOptionsReadDbgLevel( options ); |
---|
1128 | boolean printInputs = McOptionsReadPrintInputs( options ); |
---|
1129 | |
---|
1130 | if( McOptionsReadDbgLevel( options ) == McDbgLevelMin_c) |
---|
1131 | fprintf(vis_stdout, "--State\n%spasses EF formula\n\n", |
---|
1132 | firstStateName); |
---|
1133 | else |
---|
1134 | fprintf(vis_stdout, "--State\n%spasses formula %s\n\n", firstStateName, |
---|
1135 | originalFormulaText ); |
---|
1136 | |
---|
1137 | FREE(firstStateName); |
---|
1138 | FREE(originalFormulaText); |
---|
1139 | |
---|
1140 | switch ( debugLevel ) { |
---|
1141 | case McDbgLevelMin_c: |
---|
1142 | case McDbgLevelMinVerbose_c: |
---|
1143 | if ( array_n(witnessArray ) == 1 ) { |
---|
1144 | if( debugLevel != McDbgLevelMin_c) |
---|
1145 | fprintf(vis_stdout, "since %s is true at this state\n", |
---|
1146 | rOriginalFormulaText); |
---|
1147 | |
---|
1148 | FREE( rOriginalFormulaText ); |
---|
1149 | McFsmStateDebugFormula(options, rFormula, lastState, modelFsm, |
---|
1150 | careSetArray); |
---|
1151 | } |
---|
1152 | else { |
---|
1153 | if( debugLevel != McDbgLevelMin_c) |
---|
1154 | fprintf(vis_stdout, |
---|
1155 | "--Witness is a path to a state where %s is finally true\n", |
---|
1156 | rOriginalFormulaText); |
---|
1157 | (void) fprintf( vis_stdout, "\n--Fair path stem:\n"); |
---|
1158 | FREE( rOriginalFormulaText ); |
---|
1159 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1160 | Mc_PrintPath( witnessArray, modelFsm, printInputs ); |
---|
1161 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1162 | } |
---|
1163 | break; |
---|
1164 | case McDbgLevelMax_c: |
---|
1165 | case McDbgLevelInteractive_c: |
---|
1166 | if ( array_n(witnessArray ) == 1 ) { |
---|
1167 | McFsmStateDebugFormula(options, rFormula, lastState, modelFsm, |
---|
1168 | careSetArray); |
---|
1169 | } |
---|
1170 | else |
---|
1171 | { |
---|
1172 | fprintf(vis_stdout, |
---|
1173 | "--Witness is a path to a state where %s is finally true\n", |
---|
1174 | rOriginalFormulaText); |
---|
1175 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1176 | Mc_PrintPath( witnessArray, modelFsm, printInputs); |
---|
1177 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1178 | if (debugLevel == McDbgLevelMax_c || |
---|
1179 | (debugLevel == McDbgLevelInteractive_c && |
---|
1180 | McQueryContinue( |
---|
1181 | "--Continue debugging EF formula? (1-yes,0-no)\n"))) |
---|
1182 | { |
---|
1183 | McFsmStateDebugFormula(options, rFormula, lastState, modelFsm, |
---|
1184 | careSetArray); |
---|
1185 | } |
---|
1186 | } |
---|
1187 | break; |
---|
1188 | default: |
---|
1189 | fail("bad switch in debugging EF\n"); |
---|
1190 | } |
---|
1191 | FREE(rFormulaText); |
---|
1192 | } |
---|
1193 | |
---|
1194 | /**Function******************************************************************** |
---|
1195 | |
---|
1196 | Synopsis [Debug a AX formula] |
---|
1197 | |
---|
1198 | SideEffects [] |
---|
1199 | |
---|
1200 | ******************************************************************************/ |
---|
1201 | static void |
---|
1202 | FsmPathDebugAXFormula( |
---|
1203 | McOptions_t *options, |
---|
1204 | Ctlp_Formula_t *ctlFormula, |
---|
1205 | Fsm_Fsm_t *modelFsm, |
---|
1206 | McPath_t *counterExamplePath, |
---|
1207 | array_t *careSetArray) |
---|
1208 | { |
---|
1209 | Ctlp_Formula_t *originalFormula = Ctlp_FormulaReadOriginalFormula(ctlFormula); |
---|
1210 | char *originalFormulaText = Ctlp_FormulaConvertToString( originalFormula ); |
---|
1211 | Ctlp_Formula_t *lFormula = Ctlp_FormulaReadLeftChild( ctlFormula ); |
---|
1212 | Ctlp_Formula_t *llFormula = Ctlp_FormulaReadLeftChild( lFormula ); |
---|
1213 | Ctlp_Formula_t *lllFormula = Ctlp_FormulaReadLeftChild( llFormula ); |
---|
1214 | |
---|
1215 | array_t *PSVars = Fsm_FsmReadPresentStateVars( modelFsm ); |
---|
1216 | array_t *witnessArray = McPathReadStemArray( counterExamplePath ); |
---|
1217 | mdd_t *firstState = array_fetch( mdd_t *, witnessArray, 0 ); |
---|
1218 | mdd_t *lastState = array_fetch( mdd_t *, witnessArray, 1 ); |
---|
1219 | char *firstStateName = Mc_MintermToString(firstState, PSVars, |
---|
1220 | Fsm_FsmReadNetwork(modelFsm)); |
---|
1221 | boolean printInputs = McOptionsReadPrintInputs( options ); |
---|
1222 | |
---|
1223 | |
---|
1224 | if( McOptionsReadDbgLevel( options ) == McDbgLevelMin_c) |
---|
1225 | fprintf(vis_stdout, "--State\n%sfails AX formula\n\n", |
---|
1226 | firstStateName); |
---|
1227 | else |
---|
1228 | fprintf(vis_stdout, "--State\n%sfails %s\n\n", firstStateName, |
---|
1229 | originalFormulaText ); |
---|
1230 | |
---|
1231 | FREE(firstStateName); |
---|
1232 | FREE(originalFormulaText); |
---|
1233 | |
---|
1234 | switch ( McOptionsReadDbgLevel( options ) ) { |
---|
1235 | case McDbgLevelMin_c: |
---|
1236 | case McDbgLevelMinVerbose_c: |
---|
1237 | case McDbgLevelMax_c: |
---|
1238 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1239 | Mc_PrintPath( witnessArray, modelFsm, printInputs ); |
---|
1240 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1241 | fprintf(vis_stdout, "\n"); |
---|
1242 | McFsmStateDebugFormula(options, lllFormula, lastState, modelFsm, |
---|
1243 | careSetArray); |
---|
1244 | break; |
---|
1245 | case McDbgLevelInteractive_c: |
---|
1246 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1247 | Mc_PrintPath( witnessArray, modelFsm, printInputs ); |
---|
1248 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1249 | if ( McQueryContinue("Continue debugging EX formula? (1-yes,0-no)\n") ) { |
---|
1250 | McFsmStateDebugFormula(options, lllFormula, lastState, modelFsm, |
---|
1251 | careSetArray); |
---|
1252 | } |
---|
1253 | break; |
---|
1254 | default: |
---|
1255 | fail("Bad switch in FsmPathDebugAXFormula\n"); |
---|
1256 | } |
---|
1257 | } |
---|
1258 | |
---|
1259 | /**Function******************************************************************** |
---|
1260 | |
---|
1261 | Synopsis [Debug a AF formula] |
---|
1262 | |
---|
1263 | SideEffects [] |
---|
1264 | |
---|
1265 | ******************************************************************************/ |
---|
1266 | static void |
---|
1267 | FsmPathDebugAFFormula( |
---|
1268 | McOptions_t *options, |
---|
1269 | Ctlp_Formula_t *ctlFormula, |
---|
1270 | Fsm_Fsm_t *modelFsm, |
---|
1271 | McPath_t *counterExamplePath, |
---|
1272 | array_t *careSetArray) |
---|
1273 | { |
---|
1274 | Ctlp_Formula_t *originalFormula = Ctlp_FormulaReadOriginalFormula(ctlFormula); |
---|
1275 | char *originalFormulaText = Ctlp_FormulaConvertToString( originalFormula ); |
---|
1276 | Ctlp_Formula_t *lFormula = Ctlp_FormulaReadLeftChild( ctlFormula ); |
---|
1277 | Ctlp_Formula_t *llFormula = Ctlp_FormulaReadLeftChild( lFormula ); |
---|
1278 | Ctlp_Formula_t *lllFormula = Ctlp_FormulaReadLeftChild( llFormula ); |
---|
1279 | Ctlp_Formula_t *lllOriginalFormula = Ctlp_FormulaReadOriginalFormula( |
---|
1280 | lllFormula); |
---|
1281 | char *lllOriginalFormulaText = Ctlp_FormulaConvertToString( |
---|
1282 | lllOriginalFormula); |
---|
1283 | |
---|
1284 | mdd_t *firstState; |
---|
1285 | array_t *witnessArray; |
---|
1286 | array_t *PSVars = Fsm_FsmReadPresentStateVars( modelFsm ); |
---|
1287 | array_t *stemArray = McPathReadStemArray( counterExamplePath ); |
---|
1288 | array_t *cycleArray = McPathReadCycleArray( counterExamplePath ); |
---|
1289 | char *firstStateName; |
---|
1290 | McDbgLevel debugLevel = McOptionsReadDbgLevel( options ); |
---|
1291 | boolean printInputs = McOptionsReadPrintInputs( options ); |
---|
1292 | |
---|
1293 | witnessArray = McCreateMergedPath( stemArray, cycleArray ); |
---|
1294 | firstState = array_fetch( mdd_t *, witnessArray, 0 ); |
---|
1295 | firstStateName = Mc_MintermToString(firstState, PSVars, |
---|
1296 | Fsm_FsmReadNetwork(modelFsm)); |
---|
1297 | |
---|
1298 | if( McOptionsReadDbgLevel( options ) == McDbgLevelMin_c) |
---|
1299 | fprintf(vis_stdout, "--State\n%sfails AF formula\n\n", |
---|
1300 | firstStateName); |
---|
1301 | else |
---|
1302 | fprintf(vis_stdout, "--State\n%sfails %s\n\n", firstStateName, |
---|
1303 | originalFormulaText ); |
---|
1304 | FREE(firstStateName); |
---|
1305 | FREE(originalFormulaText); |
---|
1306 | |
---|
1307 | switch ( debugLevel ) { |
---|
1308 | case McDbgLevelMin_c: |
---|
1309 | case McDbgLevelMinVerbose_c: { |
---|
1310 | McPath_t *normalPath = McPathNormalize( counterExamplePath ); |
---|
1311 | array_t *stem = McPathReadStemArray( normalPath ); |
---|
1312 | array_t *cycle = McPathReadCycleArray( normalPath ); |
---|
1313 | if( debugLevel != McDbgLevelMin_c) |
---|
1314 | fprintf(vis_stdout, "--A fair path on which %s is always false:\n", |
---|
1315 | lllOriginalFormulaText ); |
---|
1316 | |
---|
1317 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1318 | (void) fprintf( vis_stdout, "--Fair path stem:\n"); |
---|
1319 | Mc_PrintPath( stem, modelFsm, printInputs ); |
---|
1320 | |
---|
1321 | (void) fprintf( vis_stdout, "--Fair path cycle:\n"); |
---|
1322 | Mc_PrintPath( cycle, modelFsm, printInputs ); |
---|
1323 | fprintf(vis_stdout, "\n"); |
---|
1324 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1325 | McPathFree( normalPath ); |
---|
1326 | break; |
---|
1327 | } |
---|
1328 | case McDbgLevelMax_c: |
---|
1329 | case McDbgLevelInteractive_c: { |
---|
1330 | int i; |
---|
1331 | McPath_t *normalPath = McPathNormalize( counterExamplePath ); |
---|
1332 | array_t *stem = McPathReadStemArray( normalPath ); |
---|
1333 | array_t *cycle = McPathReadCycleArray( normalPath ); |
---|
1334 | fprintf(vis_stdout, "--A fair path on which %s is always false:\n", |
---|
1335 | lllOriginalFormulaText ); |
---|
1336 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1337 | (void) fprintf( vis_stdout, "--Fair path stem:\n"); |
---|
1338 | Mc_PrintPath( stem, modelFsm, printInputs ); |
---|
1339 | |
---|
1340 | (void) fprintf( vis_stdout, "--Fair path cycle:\n"); |
---|
1341 | Mc_PrintPath( cycle, modelFsm, printInputs ); |
---|
1342 | fprintf(vis_stdout, "\n"); |
---|
1343 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1344 | McPathFree( normalPath ); |
---|
1345 | for( i=0 ; i < ( array_n( witnessArray )-1 ); i++ ) { |
---|
1346 | mdd_t *aState = array_fetch( mdd_t *, witnessArray, i ); |
---|
1347 | |
---|
1348 | if (debugLevel == McDbgLevelMax_c || |
---|
1349 | (debugLevel == McDbgLevelInteractive_c && |
---|
1350 | McQueryContinue( |
---|
1351 | "--Continue debugging AF formula? (1-yes,0-no)\n"))) { |
---|
1352 | McFsmStateDebugFormula(options, lllFormula, aState, modelFsm, |
---|
1353 | careSetArray); |
---|
1354 | } |
---|
1355 | } |
---|
1356 | |
---|
1357 | break; |
---|
1358 | } |
---|
1359 | default: { |
---|
1360 | fail("Bad case in switch for debugging AF formula\n"); |
---|
1361 | } |
---|
1362 | } |
---|
1363 | McNormalizeBddPointer(witnessArray); |
---|
1364 | mdd_array_free( witnessArray ); |
---|
1365 | FREE(lllOriginalFormulaText); |
---|
1366 | } |
---|
1367 | |
---|
1368 | /**Function******************************************************************** |
---|
1369 | |
---|
1370 | Synopsis [Debug an AG formula.] |
---|
1371 | |
---|
1372 | Description [Debugs an AG formula. What it really wants is a formula of the |
---|
1373 | form !EF! phi, that was converted from the formula AG phi, with all the |
---|
1374 | converted pointers set as required: the top ! points to the original AG |
---|
1375 | formula, and top node of phi points to the original phi.] |
---|
1376 | |
---|
1377 | SideEffects [] |
---|
1378 | |
---|
1379 | ******************************************************************************/ |
---|
1380 | static void |
---|
1381 | FsmPathDebugAGFormula( |
---|
1382 | McOptions_t *options, |
---|
1383 | Ctlp_Formula_t *ctlFormula, |
---|
1384 | Fsm_Fsm_t *modelFsm, |
---|
1385 | McPath_t *counterExamplePath, |
---|
1386 | array_t *careSetArray) |
---|
1387 | { |
---|
1388 | Ctlp_Formula_t *originalFormula = Ctlp_FormulaReadOriginalFormula(ctlFormula); |
---|
1389 | char *originalFormulaText = Ctlp_FormulaConvertToString( originalFormula ); |
---|
1390 | Ctlp_Formula_t *lFormula = Ctlp_FormulaReadLeftChild( ctlFormula ); |
---|
1391 | Ctlp_Formula_t *lrFormula = Ctlp_FormulaReadRightChild( lFormula ); |
---|
1392 | Ctlp_Formula_t *lrlFormula = Ctlp_FormulaReadLeftChild( lrFormula ); |
---|
1393 | Ctlp_Formula_t *lrlOriginalFormula = Ctlp_FormulaReadOriginalFormula( |
---|
1394 | lrlFormula); |
---|
1395 | char *lrlOriginalFormulaText = Ctlp_FormulaConvertToString( |
---|
1396 | lrlOriginalFormula); |
---|
1397 | |
---|
1398 | array_t *PSVars = Fsm_FsmReadPresentStateVars( modelFsm ); |
---|
1399 | array_t *witnessArray = McPathReadStemArray( counterExamplePath ); |
---|
1400 | mdd_t *firstState = array_fetch( mdd_t *, witnessArray, 0 ); |
---|
1401 | mdd_t *lastState = GET_NORMAL_PT(array_fetch_last( mdd_t *, witnessArray )); |
---|
1402 | char *firstStateName = Mc_MintermToString(firstState, PSVars, |
---|
1403 | Fsm_FsmReadNetwork(modelFsm)); |
---|
1404 | McDbgLevel debugLevel = McOptionsReadDbgLevel( options ); |
---|
1405 | boolean printInputs = McOptionsReadPrintInputs( options ); |
---|
1406 | |
---|
1407 | assert( Ctlp_FormulaReadType(ctlFormula) == Ctlp_NOT_c ); |
---|
1408 | assert( Ctlp_FormulaTestIsConverted(ctlFormula) ); |
---|
1409 | assert( Ctlp_FormulaReadType(originalFormula) == Ctlp_AG_c ); |
---|
1410 | assert( originalFormulaText != NIL(char) ); |
---|
1411 | assert( Ctlp_FormulaReadType(lFormula) == Ctlp_EU_c ); |
---|
1412 | assert( Ctlp_FormulaReadType(Ctlp_FormulaReadLeftChild(lFormula)) == |
---|
1413 | Ctlp_TRUE_c ); |
---|
1414 | assert( Ctlp_FormulaReadType(lrFormula) == Ctlp_NOT_c ); |
---|
1415 | assert( lrlOriginalFormula != NIL(Ctlp_Formula_t) ); |
---|
1416 | |
---|
1417 | if( McOptionsReadDbgLevel( options ) == McDbgLevelMin_c) |
---|
1418 | fprintf(vis_stdout, "--State\n%sfails AG formula\n\n", |
---|
1419 | firstStateName); |
---|
1420 | else |
---|
1421 | fprintf(vis_stdout, "--State\n%sfails %s\n\n", firstStateName, |
---|
1422 | originalFormulaText ); |
---|
1423 | FREE(firstStateName); |
---|
1424 | FREE(originalFormulaText); |
---|
1425 | |
---|
1426 | switch ( debugLevel ) { |
---|
1427 | case McDbgLevelMin_c: |
---|
1428 | case McDbgLevelMinVerbose_c:{ |
---|
1429 | if ( array_n(witnessArray ) == 1 ) { |
---|
1430 | if( debugLevel != McDbgLevelMin_c) |
---|
1431 | fprintf(vis_stdout, "since %s is false at this state\n", |
---|
1432 | lrlOriginalFormulaText ); |
---|
1433 | McFsmStateDebugFormula(options, lrlFormula, lastState, modelFsm, |
---|
1434 | careSetArray); |
---|
1435 | } |
---|
1436 | else { |
---|
1437 | if( debugLevel != McDbgLevelMin_c) |
---|
1438 | fprintf(vis_stdout, |
---|
1439 | "--Counter example is a path to a state where %s is false\n", |
---|
1440 | lrlOriginalFormulaText); |
---|
1441 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1442 | Mc_PrintPath(witnessArray, modelFsm, printInputs); |
---|
1443 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1444 | McFsmStateDebugFormula(options, lrlFormula, lastState, modelFsm, |
---|
1445 | careSetArray); |
---|
1446 | } |
---|
1447 | break; |
---|
1448 | } |
---|
1449 | case McDbgLevelMax_c: |
---|
1450 | case McDbgLevelInteractive_c: { |
---|
1451 | if ( array_n(witnessArray ) == 1 ) { |
---|
1452 | if( debugLevel != McDbgLevelMin_c) |
---|
1453 | fprintf(vis_stdout, "since %s is false at this state\n", |
---|
1454 | lrlOriginalFormulaText ); |
---|
1455 | McFsmStateDebugFormula(options, lrlFormula, lastState, modelFsm, |
---|
1456 | careSetArray); |
---|
1457 | } |
---|
1458 | else { |
---|
1459 | fprintf(vis_stdout, |
---|
1460 | "--Counter example is a path to a state where %s is false\n", |
---|
1461 | lrlOriginalFormulaText); |
---|
1462 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1463 | Mc_PrintPath( witnessArray, modelFsm, printInputs); |
---|
1464 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1465 | if (debugLevel == McDbgLevelMax_c || |
---|
1466 | (debugLevel == McDbgLevelInteractive_c && |
---|
1467 | McQueryContinue( |
---|
1468 | "--Continue debugging AG formula? (1-yes,0-no)\n"))) |
---|
1469 | { |
---|
1470 | McFsmStateDebugFormula(options, lrlFormula, lastState, modelFsm, |
---|
1471 | careSetArray); |
---|
1472 | } |
---|
1473 | } |
---|
1474 | break; |
---|
1475 | } |
---|
1476 | default: { |
---|
1477 | fail("bad switch in debugging AG\n"); |
---|
1478 | } |
---|
1479 | } |
---|
1480 | FREE(lrlOriginalFormulaText); |
---|
1481 | } |
---|
1482 | |
---|
1483 | /**Function******************************************************************** |
---|
1484 | |
---|
1485 | Synopsis [Debug a AU formula] |
---|
1486 | |
---|
1487 | SideEffects [] |
---|
1488 | |
---|
1489 | ******************************************************************************/ |
---|
1490 | static void |
---|
1491 | FsmPathDebugAUFormula( |
---|
1492 | McOptions_t *options, |
---|
1493 | mdd_t *aState, |
---|
1494 | Ctlp_Formula_t *ctlFormula, |
---|
1495 | Fsm_Fsm_t *modelFsm, |
---|
1496 | array_t *careSetArray) |
---|
1497 | { |
---|
1498 | Ctlp_Formula_t *originalFormula = Ctlp_FormulaReadOriginalFormula(ctlFormula); |
---|
1499 | char *originalFormulaText = Ctlp_FormulaConvertToString( originalFormula ); |
---|
1500 | Ctlp_Formula_t *lFormula = Ctlp_FormulaReadLeftChild( ctlFormula ); |
---|
1501 | Ctlp_Formula_t *lrFormula = Ctlp_FormulaReadRightChild( lFormula ); |
---|
1502 | Ctlp_Formula_t *lrlFormula = Ctlp_FormulaReadLeftChild( lrFormula ); |
---|
1503 | Ctlp_Formula_t *lrllFormula = Ctlp_FormulaReadLeftChild( lrlFormula ); |
---|
1504 | Ctlp_Formula_t *llFormula = Ctlp_FormulaReadLeftChild( lFormula ); |
---|
1505 | Ctlp_Formula_t *llrFormula = Ctlp_FormulaReadRightChild( llFormula ); |
---|
1506 | Ctlp_Formula_t *llrlFormula = Ctlp_FormulaReadLeftChild( llrFormula ); |
---|
1507 | Ctlp_Formula_t *llrllFormula = Ctlp_FormulaReadLeftChild( llrlFormula ); |
---|
1508 | Ctlp_Formula_t *fFormula = llrllFormula; |
---|
1509 | Ctlp_Formula_t *gFormula = lrllFormula; |
---|
1510 | Ctlp_Formula_t *fOriginalFormula = Ctlp_FormulaReadOriginalFormula(fFormula); |
---|
1511 | Ctlp_Formula_t *gOriginalFormula = Ctlp_FormulaReadOriginalFormula(gFormula); |
---|
1512 | char *fText = Ctlp_FormulaConvertToString( fOriginalFormula ); |
---|
1513 | char *gText = Ctlp_FormulaConvertToString( gOriginalFormula ); |
---|
1514 | |
---|
1515 | array_t *PSVars = Fsm_FsmReadPresentStateVars( modelFsm ); |
---|
1516 | char *firstStateName = Mc_MintermToString(aState, PSVars, |
---|
1517 | Fsm_FsmReadNetwork(modelFsm)); |
---|
1518 | McDbgLevel debugLevel = McOptionsReadDbgLevel( options ); |
---|
1519 | boolean printInputs = McOptionsReadPrintInputs( options ); |
---|
1520 | |
---|
1521 | if( McOptionsReadDbgLevel( options ) == McDbgLevelMin_c) |
---|
1522 | fprintf(vis_stdout, "--State\n%sfails AU formula\n\n", |
---|
1523 | firstStateName); |
---|
1524 | else |
---|
1525 | fprintf(vis_stdout, "--State\n%sfails %s\n\n", firstStateName, |
---|
1526 | originalFormulaText ); |
---|
1527 | FREE(firstStateName); |
---|
1528 | FREE(originalFormulaText); |
---|
1529 | |
---|
1530 | /* orginal formula is A(fUg) => converted is !((E[!g U (!f*!g)]) + (EG!g)) */ |
---|
1531 | |
---|
1532 | if ( McStateSatisfiesFormula( llFormula, aState ) ) { |
---|
1533 | /* |
---|
1534 | * the case E[!g U (!f*!g)] is true |
---|
1535 | */ |
---|
1536 | McPath_t *counterExamplePath = DebugEU(llFormula, aState, modelFsm, |
---|
1537 | careSetArray); |
---|
1538 | |
---|
1539 | array_t *stemArray = McPathReadStemArray( counterExamplePath ); |
---|
1540 | array_t *witnessArray = stemArray; |
---|
1541 | mdd_t *firstState = array_fetch( mdd_t *, witnessArray, 0 ); |
---|
1542 | mdd_t *lastState = array_fetch_last( mdd_t *, witnessArray ); |
---|
1543 | char *firstStateName = Mc_MintermToString(firstState, PSVars, |
---|
1544 | Fsm_FsmReadNetwork(modelFsm)); |
---|
1545 | |
---|
1546 | switch ( debugLevel ) { |
---|
1547 | case McDbgLevelMinVerbose_c: |
---|
1548 | fprintf(vis_stdout, |
---|
1549 | "--Counter example is a fair path where %s is false until %s is also false\n", |
---|
1550 | gText, fText); |
---|
1551 | case McDbgLevelMin_c: |
---|
1552 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1553 | Mc_PrintPath(witnessArray, modelFsm, printInputs); |
---|
1554 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1555 | McFsmStateDebugFormula(options, llrFormula, lastState, modelFsm, |
---|
1556 | careSetArray); |
---|
1557 | break; |
---|
1558 | |
---|
1559 | case McDbgLevelMax_c: |
---|
1560 | case McDbgLevelInteractive_c: { |
---|
1561 | if ( array_n(witnessArray ) == 1 ) { |
---|
1562 | fprintf(vis_stdout, |
---|
1563 | "--At state %s\nformula %s is false and\nformula %s is also false\n", |
---|
1564 | firstStateName, fText, gText); |
---|
1565 | if (debugLevel == McDbgLevelMax_c || |
---|
1566 | (debugLevel == McDbgLevelInteractive_c && |
---|
1567 | McQueryContinue( |
---|
1568 | "Continue debugging AU formula? (1-yes,0-no)\n"))) { |
---|
1569 | McFsmStateDebugFormula(options, fFormula, aState, modelFsm, |
---|
1570 | careSetArray); |
---|
1571 | McFsmStateDebugFormula(options, gFormula, aState, modelFsm, |
---|
1572 | careSetArray); |
---|
1573 | } |
---|
1574 | } |
---|
1575 | else { |
---|
1576 | int i; |
---|
1577 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1578 | Mc_PrintPath(witnessArray,modelFsm,printInputs); |
---|
1579 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1580 | for( i=0 ; i < ( array_n( witnessArray ) - 1 ); i++ ) { |
---|
1581 | mdd_t *aState = array_fetch( mdd_t *, witnessArray, i ); |
---|
1582 | |
---|
1583 | if (debugLevel == McDbgLevelMax_c || |
---|
1584 | (debugLevel == McDbgLevelInteractive_c && |
---|
1585 | McQueryContinue( |
---|
1586 | "Continue debugging AU formula? (1-yes,0-no)\n"))) { |
---|
1587 | McFsmStateDebugFormula(options, gFormula, aState, modelFsm, |
---|
1588 | careSetArray); |
---|
1589 | } |
---|
1590 | } |
---|
1591 | |
---|
1592 | if (debugLevel == McDbgLevelMax_c || |
---|
1593 | (debugLevel == McDbgLevelInteractive_c && |
---|
1594 | McQueryContinue( |
---|
1595 | "Continue debugging AU formula? (1-yes,0-no)\n"))) { |
---|
1596 | McFsmStateDebugFormula(options, fFormula, lastState, modelFsm, |
---|
1597 | careSetArray); |
---|
1598 | McFsmStateDebugFormula(options, gFormula, lastState, modelFsm, |
---|
1599 | careSetArray); |
---|
1600 | } |
---|
1601 | } |
---|
1602 | break; |
---|
1603 | } |
---|
1604 | |
---|
1605 | default: { |
---|
1606 | fail("Unknown case in debugging AU\n"); |
---|
1607 | } |
---|
1608 | }/* case */ |
---|
1609 | McPathFree( counterExamplePath ); |
---|
1610 | } |
---|
1611 | else { |
---|
1612 | /* |
---|
1613 | * must be the case that EG!g |
---|
1614 | */ |
---|
1615 | McPath_t *counterExamplePath = DebugEG(lrFormula, aState, modelFsm, |
---|
1616 | careSetArray, |
---|
1617 | options); |
---|
1618 | |
---|
1619 | assert( McStateSatisfiesFormula( lrFormula, aState ) ); |
---|
1620 | |
---|
1621 | if( debugLevel != McDbgLevelMin_c) |
---|
1622 | fprintf(vis_stdout, |
---|
1623 | "--Counter example is a fair path where %s is always false\n", |
---|
1624 | gText); |
---|
1625 | |
---|
1626 | switch ( debugLevel ) { |
---|
1627 | case McDbgLevelMin_c: |
---|
1628 | case McDbgLevelMinVerbose_c:{ |
---|
1629 | McPath_t *normalPath = McPathNormalize( counterExamplePath ); |
---|
1630 | array_t *stem = McPathReadStemArray( normalPath ); |
---|
1631 | array_t *cycle = McPathReadCycleArray( normalPath ); |
---|
1632 | |
---|
1633 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1634 | (void) fprintf( vis_stdout, "--Fair path stem:\n"); |
---|
1635 | Mc_PrintPath( stem, modelFsm, printInputs ); |
---|
1636 | |
---|
1637 | (void) fprintf( vis_stdout, "--Fair path cycle:\n"); |
---|
1638 | Mc_PrintPath( cycle, modelFsm, printInputs ); |
---|
1639 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1640 | McPathFree( normalPath ); |
---|
1641 | break; |
---|
1642 | } |
---|
1643 | |
---|
1644 | case McDbgLevelMax_c: |
---|
1645 | case McDbgLevelInteractive_c: |
---|
1646 | { |
---|
1647 | int i; |
---|
1648 | array_t *stemArray = McPathReadStemArray( counterExamplePath ); |
---|
1649 | array_t *cycleArray = McPathReadCycleArray( counterExamplePath ); |
---|
1650 | array_t *witnessArray = McCreateMergedPath( stemArray, cycleArray ); |
---|
1651 | McPath_t *normalPath = McPathNormalize( counterExamplePath ); |
---|
1652 | array_t *stem = McPathReadStemArray( normalPath ); |
---|
1653 | array_t *cycle = McPathReadCycleArray( normalPath ); |
---|
1654 | |
---|
1655 | fprintf(vis_stdout, " --Counter example begins\n"); |
---|
1656 | (void) fprintf( vis_stdout, "--Fair path stem:\n"); |
---|
1657 | Mc_PrintPath( stem, modelFsm, printInputs ); |
---|
1658 | |
---|
1659 | (void) fprintf( vis_stdout, "--Fair path cycle:\n"); |
---|
1660 | Mc_PrintPath( cycle, modelFsm, printInputs ); |
---|
1661 | fprintf(vis_stdout, " --Counter example ends\n\n"); |
---|
1662 | McPathFree( normalPath ); |
---|
1663 | for( i=0 ; i < ( array_n( witnessArray )-1 ); i++ ) { |
---|
1664 | mdd_t *aState = array_fetch( mdd_t *, witnessArray, i ); |
---|
1665 | |
---|
1666 | if (debugLevel == McDbgLevelMax_c || |
---|
1667 | (debugLevel == McDbgLevelInteractive_c && |
---|
1668 | McQueryContinue( |
---|
1669 | "--Continue debugging AU formula? (1-yes,0-no)\n"))) { |
---|
1670 | McFsmStateDebugFormula(options, lrllFormula, aState, modelFsm, |
---|
1671 | careSetArray); |
---|
1672 | } |
---|
1673 | } |
---|
1674 | break; |
---|
1675 | } |
---|
1676 | |
---|
1677 | default: { |
---|
1678 | fail("Bad switch in debugging AU formula\n"); |
---|
1679 | } |
---|
1680 | }/* case */ |
---|
1681 | McPathFree( counterExamplePath ); |
---|
1682 | } |
---|
1683 | |
---|
1684 | FREE( fText ); |
---|
1685 | FREE( gText ); |
---|
1686 | } |
---|