source: vis_dev/vis-2.3/src/debug/debug.c @ 102

Last change on this file since 102 was 101, checked in by syed, 12 years ago

final

File size: 34.9 KB
Line 
1/**CFile***********************************************************************
2
3  FileName    [debug.c]
4
5  PackageName [debug]
6
7  Synopsis    [Debug package initialization, ending, and the command debug]
8
9  Author      [Cecile B.]
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 "debugInt.h"
33#include "imgInt.h"
34#include "partInt.h"
35static char rcsid[] UNUSED = "$Id: debug.c,v 1.6 2011/04/12  braun Exp $";
36
37/*---------------------------------------------------------------------------*/
38/* Constant declarations                                                     */
39/*---------------------------------------------------------------------------*/
40
41/*---------------------------------------------------------------------------*/
42/* Structure declarations                                                    */
43/*---------------------------------------------------------------------------*/
44
45/*---------------------------------------------------------------------------*/
46/* Type declarations                                                         */
47/*---------------------------------------------------------------------------*/
48
49/*---------------------------------------------------------------------------*/
50/* Variable declarations                                                     */
51/*---------------------------------------------------------------------------*/
52
53/*---------------------------------------------------------------------------*/
54/* Macro declarations                                                        */
55/*---------------------------------------------------------------------------*/
56
57/**AutomaticStart*************************************************************/
58
59/*---------------------------------------------------------------------------*/
60/* Static function prototypes                                                */
61/*---------------------------------------------------------------------------*/
62
63static int CommandSatDebug(Hrc_Manager_t ** hmgr, int argc, char ** argv);
64static int CommandDebug(Hrc_Manager_t ** hmgr, int argc, char ** argv);
65static int CommandTransition(Hrc_Manager_t ** hmgr,int  argc, char ** argv);
66static int CommandCreateAbnormal(Hrc_Manager_t ** hmgr,int  argc, char ** argv);
67static int CommandGenerateNetworkCNF(Hrc_Manager_t ** hmgr,int  argc, char ** argv);
68static int CommandBuildCexBdd(Hrc_Manager_t ** hmgr,int  argc, char ** argv);
69
70
71/**AutomaticEnd***************************************************************/
72
73
74/*---------------------------------------------------------------------------*/
75/* Definition of exported functions                                          */
76/*---------------------------------------------------------------------------*/
77
78/**Function********************************************************************
79
80  Synopsis    [Initializes the test package.]
81
82  SideEffects []
83
84  SeeAlso     [Debug_End]
85
86******************************************************************************/
87void
88Debug_Init(void)
89{
90  /*
91   * Add a command to the global command table.  By using the leading
92   * underscore, the command will be listed under "help -a" but not "help".
93   */
94  Cmd_CommandAdd("_debug_test",  CommandDebug, /* doesn't changes_network */ 0);
95  Cmd_CommandAdd("_transition",  CommandTransition, 1);
96  Cmd_CommandAdd("_sat_debug",   CommandSatDebug, 0);
97  Cmd_CommandAdd("_createAbn",   CommandCreateAbnormal, 1);
98  Cmd_CommandAdd("_cexbdd",      CommandBuildCexBdd, 0);
99  Cmd_CommandAdd("print_network_cnf",  CommandGenerateNetworkCNF, 0);
100
101}
102
103
104/**Function********************************************************************
105
106  Synopsis    [Ends the test package.]
107
108  SideEffects []
109
110  SeeAlso     [Debug_Init]
111
112******************************************************************************/
113void
114Debug_End(void)
115{
116  /*
117   * For example, free any global memory (if any) which the test package is
118   * responsible for.
119   */
120}
121
122
123/*---------------------------------------------------------------------------*/
124/* Definition of internal functions                                          */
125/*---------------------------------------------------------------------------*/
126
127
128/*---------------------------------------------------------------------------*/
129/* Definition of static functions                                            */
130/*---------------------------------------------------------------------------*/
131
132
133static int CommandCreateAbnormal(Hrc_Manager_t ** hmgr, int  argc, char ** argv)
134{
135  Ntk_Network_t * ntk;
136  int c,verbose = 0;
137  array_t * excludes = NIL(array_t);
138  Dbg_Abnormal_t * abnormal;
139  ntk = Ntk_HrcManagerReadCurrentNetwork(*hmgr);
140  char * subs;
141  if (ntk == NIL(Ntk_Network_t)) {
142        (void) fprintf(vis_stdout, "** abn error: No network\n");
143        return 1;
144  }
145  while ((c = util_getopt(argc, argv, "vhs:")) != EOF) {
146        switch(c) {
147        case 'h':
148          goto usage;
149                case 'v':
150                        verbose = 1;
151                        break;
152        case 's':
153            subs =  util_strsav(util_optarg);
154            excludes = array_alloc(char*,0);
155            array_insert_last(char*,excludes,subs);
156            break;
157        default :
158          goto usage;
159                }
160 }
161  abnormal = Dbg_DebugAbnormalAlloc(ntk);
162  abnormal->verbose = verbose;
163    printf("SUBS %s \n",subs);
164  Dbg_AddAbnormalPredicatetoNetwork(abnormal,excludes);
165  printf("\t # Abnormal predicate created  %d\n", array_n(abnormal->abnormal));
166    return 0;
167  usage : 
168   (void) fprintf(vis_stderr, "usage: _createAbn [-h] [-v verboseLevel] [-s substystem excludes\n");
169  (void) fprintf(vis_stderr, "   -h \tprint the command usage\n");
170  (void) fprintf(vis_stderr, "   -v  \t verbosity\n");
171  (void) fprintf(vis_stderr, "   -s <subsystemName> \texclude the abnormal predicate\
172  for this subssytem\n");
173  return 1;
174}
175
176/**Function********************************************************************
177
178  Synopsis    [Implements the _sat_debug command.]
179
180  CommandName [_sat_debug]
181
182  CommandSynopsis [locate faulty candidates]
183
184  CommandArguments [\[-h\] \[-v\]]
185 
186  CommandDescription [This command compute the fault candidates of a given
187  properties.<p>
188
189  Command options:<p> 
190
191  <dl>
192  <dt> -h
193  <dd> Print the command usage.
194  </dl>
195
196  <dt> -v
197  <dd> Verbose mode.
198  </dl>
199  ]
200
201  SideEffects []
202
203******************************************************************************/
204static int 
205CommandSatDebug(
206Hrc_Manager_t ** hmgr, 
207int argc, 
208char ** argv){
209int            c,i;
210int            verbose = 0;              /* default value */
211BmcOption_t      * options = BmcOptionAlloc();
212Ntk_Network_t    * network;
213bAig_Manager_t   * manager;
214array_t          * formulaArray;
215array_t          * LTLformulaArray;
216array_t          * faultNodes = array_alloc(Ntk_Node_t*,0);
217
218/*
219 * Parse command line options.
220 */
221if ((options = ParseBmcOptions(argc, argv)) == NIL(BmcOption_t)) {
222     return 1;
223}
224
225
226
227if (verbose) {
228  (void) fprintf(vis_stdout, "The _sat_debug command is under construction.\n");
229}
230/*
231 *  Read the network
232 */
233network = Ntk_HrcManagerReadCurrentNetwork(*hmgr);
234if (network == NIL(Ntk_Network_t)) {
235  (void) fprintf(vis_stdout, "** _sat_debug error: No network\n");
236  BmcOptionFree(options);
237  return 1;
238}
239manager = Ntk_NetworkReadMAigManager(network);
240if (manager == NIL(mAig_Manager_t)) {
241  (void) fprintf(vis_stdout, "** _sat_debug error: run build_partition_maigs command first\n");
242  BmcOptionFree(options);
243  return 1;
244}
245
246Dbg_Abnormal_t * abn = Dbg_NetworkReadAbnormal(network);
247if(abn == NIL(Dbg_Abnormal_t)){
248  (void) fprintf(vis_stdout, "_sat_debug error: Build Abnormal predicate.\n");
249  return 1;
250}
251if(verbose)
252  printf("abnormal %d \n",array_n(Dbg_ReadAbn(abn)));
253
254
255formulaArray  = Ctlsp_FileParseFormulaArray(options->ltlFile);
256if (formulaArray == NIL(array_t)) {
257  (void) fprintf(vis_stderr,
258           "** bmc error: error in parsing CTL* Fromula from file\n");
259  BmcOptionFree(options);
260  return 1;
261}
262if (array_n(formulaArray) == 0) {
263  (void) fprintf(vis_stderr, "** bmc error: No formula in file\n");
264  BmcOptionFree(options);
265  Ctlsp_FormulaArrayFree(formulaArray);
266  return 1;
267}
268LTLformulaArray = Ctlsp_FormulaArrayConvertToLTL(formulaArray);
269Ctlsp_FormulaArrayFree(formulaArray);
270if (LTLformulaArray ==  NIL(array_t)){
271  (void) fprintf(vis_stdout, "** bmc error: Invalid LTL formula\n");
272  BmcOptionFree(options);
273  return 1;
274}
275Ctlsp_Formula_t *ltlFormula  = array_fetch(Ctlsp_Formula_t *, LTLformulaArray, 0);
276
277
278 /*
279    Compute the cone of influence
280        here : a list of state variables (latches)
281    TODO refine to COI of the property
282  */
283        st_table        *CoiTable =  generateAllLatches(network);
284  /*
285      Generate clauses for each time frame.  This is the old way of generating
286      clauses in BMC.
287    */
288        if(verbose)
289        {       
290                (void) fprintf(vis_stdout, "------      COI       ----\n");
291                printLatch(CoiTable);
292                (void) fprintf(vis_stdout, "--------------------------\n");
293    }
294    BmcCnfClauses_t* cnfClauses =  Dbg_GenerateCNF(network,options,CoiTable);
295
296
297    //Generate ltl CNF
298    // BmcGenerateCnfForLtl Génére la formule borné et retourne un index
299    // aprÚs il faut ajouter l'objectif de l'index avec boucle ou pas ...
300    // cf. BmcLtlVerifyGeneralLtl
301    Ctlsp_FormulaPrint(vis_stdout, ltlFormula);
302    fprintf(vis_stdout, "\n");
303    int k = options->maxK;
304    int l;
305    // return the clause number
306    int noLoopIndex = BmcGenerateCnfForLtl(network, ltlFormula, 0, k, k, cnfClauses);    printf("LTL %d  \n",noLoopIndex);
307   
308
309        array_t *objClause = NIL(array_t);
310        objClause = array_alloc(int, 0);   
311        array_insert_last(int, objClause, noLoopIndex);
312        BmcCnfInsertClause(cnfClauses, objClause);
313    array_free(objClause);
314
315        //Add Abnormal
316    st_table * nodeToMvfAigTable =  NIL(st_table);
317    nodeToMvfAigTable =
318    (st_table *) Ntk_NetworkReadApplInfo(network, MVFAIG_NETWORK_APPL_KEY);
319    assert(nodeToMvfAigTable != NIL(st_table));
320
321    Dbg_InitAbn(abn,manager, nodeToMvfAigTable,k,cnfClauses);
322
323    //loop abnormal
324    int aIndex;
325    Ntk_Node_t * abnNode;
326    Dbg_ForEachAbnormal(abn,aIndex,abnNode){
327      char * nodeName =  Ntk_NodeReadName(abnNode);
328    //set abnormal for each step
329      array_t * cnfIndexArray = array_fetch(array_t*,abn->abnCnfIndexArray,aIndex);
330      int cnfIndex;
331      int step;
332      bAigEdge_t* abnBAig = array_fetch(bAigEdge_t*,abn->abnAigArray, aIndex);
333      array_t * cnfVal = array_alloc(int,0);
334      arrayForEachItem(int, cnfIndexArray, step, cnfIndex){
335        int abnIndex = BmcGenerateCnfFormulaForAigFunction(manager,abnBAig[1],step,cnfClauses);
336        array_insert(int,cnfClauses->clauseArray,cnfIndex,abnIndex);
337        array_insert_last(int,cnfVal,abnIndex);
338        FILE *cnfFile = Cmd_FileOpen(options->satInFile, "w", NIL(char *), 0);
339        BmcWriteClauses(manager, cnfFile, cnfClauses, options);
340        fclose(cnfFile);
341        printf("AINDEX %d\n",aIndex);
342        if(aIndex == 0)
343        {
344        FILE *cnfFile = Cmd_FileOpen("test_aks.cnf", "w", NIL(char *), 0);
345        BmcWriteClauses(manager, cnfFile, cnfClauses, options);
346        fclose(cnfFile);
347         
348        }
349      }//end for each step
350
351      //SAT procedure
352      //assig assig input from cex
353      //TODO build cex correctly
354      int res = Dbg_SatCheck("assig",options->satInFile,options->verbosityLevel);
355      // Build set of FaultCandidates
356      if (res == SAT_SAT)
357      {
358        char * realNodeName = util_strsav(nodeName);
359        realNodeName[strlen(nodeName)-3] = '\0';
360        printf("Real = %s\n", realNodeName);
361        Ntk_Node_t * realNode =  Ntk_NetworkFindNodeByName(network,realNodeName);
362        array_insert_last(Ntk_Node_t*,faultNodes,realNode);
363      }
364
365      arrayForEachItem(int, cnfIndexArray, step, cnfIndex){
366        int abnIndex = array_fetch(int,cnfVal,step);       
367        array_insert(int,cnfClauses->clauseArray,cnfIndex,-abnIndex);
368      }
369   }
370
371         if(verbose)
372                (void) fprintf(vis_stdout, "The _sat_debug generates %d clauses with %d\
373                latches \n",cnfClauses->noOfClauses,st_count(CoiTable));
374 
375   
376        (void) fprintf(vis_stdout,"Number of Fault candidates %d\n",
377    array_n(faultNodes));
378        (void) fprintf(vis_stdout,"gates : \n");
379
380
381    printNodeArray(faultNodes);
382
383   
384Ctlsp_FormulaArrayFree(LTLformulaArray);   
385BmcCnfClausesFree(cnfClauses);
386BmcOptionFree(options);
387array_free(faultNodes);
388return 0;
389}
390
391/**Function********************************************************************
392
393  Synopsis    [Implements the generate_network_cnf.]
394
395  CommandName [generate_network_cnf]
396
397  CommandSynopsis [generate a CNF view of the network]
398
399  CommandArguments [\[-h\] \[-v\] \[-k\]  [fileName] ]
400 
401  CommandDescription [This command generate a CNF of the network in DMACS form.
402  The network may be unroll within k steps.
403  <p>
404
405  Command options:<p> 
406
407  <dl>
408  <dt> -h
409  <dd> Print the command usage.
410  </dl>
411
412  <dt> -v
413  <dd> Verbose mode.
414  </dl>
415
416  <dt> -k
417  <dd> number of steps (default 1).
418  </dl>
419  ]
420
421  SideEffects []
422
423******************************************************************************/
424
425static int CommandGenerateNetworkCNF(Hrc_Manager_t ** hmgr,int  argc, char ** argv)
426{
427  BmcOption_t  *options = BmcOptionAlloc();
428  int c;
429  unsigned int i;
430  Ntk_Network_t * network;
431  bAig_Manager_t   * manager;
432  char *  outName = NIL(char);
433   FILE *cnfFile;
434  if (!options){
435    return 1;
436  }
437  options->dbgOut = 0;
438  /*
439   * Parse command line options.
440   */
441  util_getopt_reset();
442  while ((c = util_getopt(argc, argv, "hv:k:")) != EOF) {
443    switch(c) {
444    case 'h':
445      goto usage;
446    case 'k':
447      options->maxK = atoi(util_optarg);
448      break;
449    case 'v':
450      for (i = 0; i < strlen(util_optarg); i++) {
451        if (!isdigit((int)util_optarg[i])) {
452          goto usage;
453        }
454      }
455      options->verbosityLevel = (Bmc_VerbosityLevel) atoi(util_optarg);
456      break;
457    default:
458      goto usage;
459    }
460  }
461   if (argc - util_optind != 0)
462   {
463     outName  = util_strsav(argv[util_optind]);
464     /* create SAT Solver input file */
465     options->cnfFileName= outName;
466     options->satInFile = options->cnfFileName;
467     cnfFile = Cmd_FileOpen(options->satInFile, "w", NIL(char *), 0); 
468  }
469 
470 
471/*
472 *  Read the network
473 */
474network = Ntk_HrcManagerReadCurrentNetwork(*hmgr);
475if (network == NIL(Ntk_Network_t)) {
476  (void) fprintf(vis_stdout, "** generate_network_cnf error: No network\n");
477  BmcOptionFree(options);
478  return 1;
479}
480manager = Ntk_NetworkReadMAigManager(network);
481if (manager == NIL(mAig_Manager_t)) {
482  (void) fprintf(vis_stdout, "** generate_network_cnf error: run build_partition_maigs command first\n");
483  BmcOptionFree(options);
484  return 1;
485}
486
487 /*
488    Compute the cone of influence
489        here : a list of state variables (latches)
490  */
491st_table        *CoiTable =  generateAllLatches(network);
492
493if(options->verbosityLevel)
494{       
495        (void) fprintf(vis_stdout, "------      COI       ----\n");
496        printLatch(CoiTable);
497        (void) fprintf(vis_stdout, "--------------------------\n");
498}
499BmcCnfClauses_t* cnfClauses =  Dbg_GenerateCNF(network,options,CoiTable);
500  if(outName != NIL(char))
501  {
502    BmcWriteClauses(manager, cnfFile, cnfClauses, options);
503    fclose(cnfFile);
504  }
505  else
506     BmcWriteClauses(manager, vis_stdout, cnfClauses, options);
507
508if(options->verbosityLevel)
509{       
510        (void) fprintf(vis_stdout, "CNF generated for %d steps", options->maxK);
511    (void) fprintf(vis_stdout, " %d clauses with %d latche(s).\n",cnfClauses->noOfClauses,
512    st_count(CoiTable));
513} 
514   
515BmcOptionFree(options);
516 return 0;
517 usage:
518  (void) fprintf(vis_stderr, "usage: bmc [-h][-k maximum_length][-v verbosity_level] <cnf_file>\n");
519  (void) fprintf(vis_stderr, "   -h \tprint the command usage\n");
520  (void) fprintf(vis_stderr, "   -k \tmaximum length of counterexample to be checked (default is 1)\n");
521  (void) fprintf(vis_stderr, "   -v <verbosity_level>\n");
522  (void) fprintf(vis_stderr, "       verbosity_level = 0 => no feedback (Default)\n");
523  (void) fprintf(vis_stderr, "       verbosity_level = 1 => code status\n");
524  (void) fprintf(vis_stderr, "       verbosity_level = 2 => code status and CPU usage profile\n");
525  (void) fprintf(vis_stderr, "   <cnf_file> The output file containing CNF of the network.\n");
526
527  BmcOptionFree(options);
528  return 1;
529}
530
531/**Function********************************************************************
532
533  Synopsis    [Implements the _Debug_test command.]
534
535  CommandName [_Debug_test]
536
537  CommandSynopsis [template for implementing commands]
538
539  CommandArguments [\[-h\] \[-v\]]
540 
541  CommandDescription [This command does nothing useful.  It merely serves as a
542  template for the implementation of new commands.<p>
543
544  Command options:<p> 
545
546  <dl>
547  <dt> -h
548  <dd> Print the command usage.
549  </dl>
550
551  <dt> -v
552  <dd> Verbose mode.
553  </dl>
554  ]
555
556  SideEffects []
557
558******************************************************************************/
559static int
560CommandDebug(
561  Hrc_Manager_t ** hmgr,
562  int  argc,
563  char ** argv)
564{
565  int            c;
566  int            verbose = 0;              /* default value */
567
568  /*
569   * Parse command line options.
570   */
571  util_getopt_reset();
572  while ((c = util_getopt(argc, argv, "vh")) != EOF) {
573    switch(c) {
574      case 'v':
575        verbose = 1;
576        break;
577      case 'h':
578        goto usage;
579      default:
580        goto usage;
581    }
582  }
583
584  if (verbose) {
585    (void) fprintf(vis_stdout, "The _Debug_test is under construction.\n");
586  }
587
588  Fsm_Fsm_t   *fsm        = Fsm_HrcManagerReadCurrentFsm(*hmgr);
589  mdd_manager *mddManager = Fsm_FsmReadMddManager(fsm);
590  printf("** DEBUG MODE **\n");
591  Hrc_Node_t * n = Hrc_ManagerReadRootNode(*hmgr);
592  printf("model : %s\n", Hrc_NodeReadModelName(n));
593
594  mdd_t * safe   = getSafe(fsm);
595  mdd_t * forbid = getForbidden(fsm);
596  mdd_t * reach  = getReach(fsm);
597 
598  if(safe == NIL(mdd_t))
599  {
600        printf("call command set_safe before\n");
601        return 1;
602  }
603  if(forbid == NIL(mdd_t))
604  {
605        printf("call command set_forbidden before\n");
606        return 1;
607  }
608
609  FILE*  oFile;
610  oFile = Cmd_FileOpen("safe_prop", "w", NIL(char *), 0);
611 // mdd_FunctionPrintMain(mddManager, safe, "SAFE", oFile);
612//  mdd_FunctionPrintMain(mddManager, reach, "REACH", oFile);
613
614  mdd_t * EFState = mdd_and(reach,safe,1,1);
615//  mdd_t * errorState = mdd_and(reach,forbid,1,1);
616
617  mdd_t *mddOne = mdd_one(Fsm_FsmReadMddManager(fsm));
618  array_t *careStatesArray = array_alloc(mdd_t *, 0);
619  array_insert(mdd_t *, careStatesArray, 0,mddOne);
620
621  mdd_t * tmp_EXEFState = Mc_FsmEvaluateEXFormula( fsm,
622                   EFState,
623           fsm->fairnessInfo.states,
624           careStatesArray,
625                   0,
626           McDcLevelNone_c);
627
628  mdd_t * EXEFState = mdd_and(reach,tmp_EXEFState,1,1);
629  mdd_FunctionPrintMain(mddManager, EXEFState, "EXEF", oFile);
630
631  tmp_EXEFState = Mc_FsmEvaluateEXFormula( fsm,
632                   EXEFState,
633           fsm->fairnessInfo.states,
634           careStatesArray,
635                   0,
636           McDcLevelNone_c);
637  mdd_t * EXEFState2 = mdd_and(reach,tmp_EXEFState,1,1);
638  mdd_FunctionPrintMain(mddManager, EXEFState2, "EXEF2", oFile);
639  mdd_t * andState =  mdd_xor(EXEFState2,EXEFState);
640  mdd_FunctionPrintMain(mddManager, andState, "XOR2", oFile);
641  tmp_EXEFState = Mc_FsmEvaluateEXFormula( fsm,
642                   andState,
643           fsm->fairnessInfo.states,
644           careStatesArray,
645                   0,
646           McDcLevelNone_c);
647  EXEFState2 = mdd_and(reach,tmp_EXEFState,1,1);
648  mdd_FunctionPrintMain(mddManager, EXEFState2, "EXEF2", oFile);
649  andState =  mdd_xor(EXEFState2,andState);
650  mdd_FunctionPrintMain(mddManager, andState, "XOR", oFile);
651  tmp_EXEFState = Mc_FsmEvaluateEXFormula( fsm,
652                   andState,
653           fsm->fairnessInfo.states,
654           careStatesArray,
655                   0,
656           McDcLevelNone_c);
657  EXEFState2 = mdd_and(reach,tmp_EXEFState,1,1);
658  mdd_FunctionPrintMain(mddManager, EXEFState2, "EXEF2", oFile);
659  andState =  mdd_xor(EXEFState2,andState);
660  mdd_FunctionPrintMain(mddManager, andState, "XOR", oFile);
661
662
663
664  //mdd_FunctionPrintMain(mddManager, errorState, "ERROR", oFile);
665  //mdd_GetState_Values(mddManager , EFState, stdout);
666  fclose(oFile);
667
668
669
670
671
672  return 0;             /* normal exit */
673
674  usage:
675  (void) fprintf(vis_stderr, "usage: _Debug_test [-h] [-v]\n");
676  (void) fprintf(vis_stderr, "   -h\t\tprint the command usage\n");
677  (void) fprintf(vis_stderr, "   -v\t\tverbose\n");
678  return 1;             /* error exit */
679}
680
681/******************************************/
682/* function that build a bdd for the      */
683/* simple example :                       */
684/*     (state = 0) -> !(state = 1)        */
685/******************************************/
686mdd_t * buildDummyBdd(mdd_manager   *mddManager)
687{
688/** state0 = 0 **/
689 mdd_t * s0 =  mdd_eq_c(mddManager,0, 0);
690 mdd_t * s1 =  mdd_eq_c(mddManager,2, 0);
691 mdd_t * state0 =  mdd_one(mddManager);
692 state0 = mdd_and(s0,s1,1,1);
693/** state1 = 1 **/
694 mdd_t * ns0 =  mdd_eq_c(mddManager,1, 1);
695 mdd_t * ns1 =  mdd_eq_c(mddManager,3, 0);
696 mdd_t * state1 =  mdd_one(mddManager);
697 state1 = mdd_and(ns0,ns1,1,1);
698/** state = 0) -> !(state = 1) **/
699 mdd_t * rel =  mdd_one(mddManager);
700 rel =  mdd_or(state0,state1,0,0);
701 
702 return rel;
703}
704mdd_t * buildDummy2(mdd_manager * mddManager)
705{
706 mdd_t * rel = NIL(mdd_t);
707 mdd_t * state0 = mdd_one(mddManager);
708 mdd_t * state2 = mdd_one(mddManager);
709 mdd_t * state3 = mdd_one(mddManager);
710  // state0 = s0
711 mdd_t * s0 =  mdd_eq_c(mddManager,0, 0);
712 mdd_t * s1 =  mdd_eq_c(mddManager,2, 0);
713 state0 = mdd_and(s0,s1,1,1);
714  // state2 = s2
715 s0 =  mdd_eq_c(mddManager,0, 0);
716 s1 =  mdd_eq_c(mddManager,2, 1);
717 state2 = mdd_and(s0,s1,1,1);
718  // state3 = s3
719 s0 =  mdd_eq_c(mddManager,0, 1);
720 s1 =  mdd_eq_c(mddManager,2, 1);
721 state3 = mdd_and(s0,s1,1,1);
722// Build transition relation
723
724 array_t * mvarVal = array_alloc(int,0);
725 array_insert_last(int, mvarVal,2);
726 array_t * val = array_alloc(int,0);
727 array_t * mvarName = array_alloc(char*,0);
728 array_insert_last(char*, mvarName,"S1");
729 int e1Id = mdd_create_variables(mddManager,mvarVal,mvarName,NIL(array_t));
730 array_insert(char*, mvarName,0,"I");
731 int e0Id = mdd_create_variables(mddManager,mvarVal,mvarName,NIL(array_t));
732 array_insert_last(int, val,1);
733 mdd_t * e1 = mdd_literal(mddManager, e1Id,val);
734 mdd_t * e0 = mdd_literal(mddManager, e0Id,val);
735 mdd_t * tmp2 = mdd_and(e1,e0,0,0);
736mdd_t *  ne2_1 = mdd_or(e1,tmp2,1,1);
737mdd_t *  ne2_0 = mdd_and(e1,e0,0,1);
738
739array_insert(char*, mvarName,0,"Next_SI");
740int id = mdd_create_variables(mddManager,mvarVal,mvarName,NIL(array_t));
741Mvf_Function_t * mvf = Mvf_FunctionAlloc(mddManager, 2);
742Mvf_FunctionAddMintermsToComponent(mvf,1,ne2_1);
743Mvf_FunctionAddMintermsToComponent(mvf,0,ne2_0);
744mdd_t *relation = Mvf_FunctionBuildRelationWithVariable(mvf, id);
745
746//bdd_print(relation);
747mdd_FunctionPrintMain (mddManager ,relation,"news",vis_stdout);
748 //bdd_ite
749 return rel;
750
751}
752
753/**Function********************************************************************
754
755  Synopsis    [Implements the transtion command.]
756
757  CommandName [_transition]
758
759  CommandSynopsis [compute new transition relation]
760
761  CommandArguments [\[-h\] \[-v\]]
762 
763  CommandDescription [This command create a new transition relation that is a
764  and of the Bdd of the old one and another bdd.
765  <p>
766
767  Command options:<p> 
768
769  <dl>
770  <dt> -h
771  <dd> Print the command usage.
772  </dl>
773
774  <dt> -v
775  <dd> Verbose mode.
776  </dl>
777  ]
778
779  SideEffects [Change the fsm]
780
781******************************************************************************/
782
783static int 
784CommandTransition (Hrc_Manager_t ** hmgr,
785                   int  argc, char ** argv){
786int            c;
787int            verbose = 0;              /* default value */
788
789/*
790 * Parse command line options.
791 */
792util_getopt_reset();
793while ((c = util_getopt(argc, argv, "vh")) != EOF) {
794  switch(c) {
795    case 'v':
796      verbose = 1;
797      break;
798    case 'h':
799      goto usage;
800    default:
801      goto usage;
802  }
803}
804
805if (verbose) {
806  (void) fprintf(vis_stdout, "The _transition is under construction.\n");
807}
808
809Fsm_Fsm_t      *fsm          = NIL(Fsm_Fsm_t);
810Ntk_Network_t  *network      = NIL(Ntk_Network_t);
811mdd_manager    *mddManager; 
812mdd_t          *rel          = NIL(mdd_t);
813graph_t        *partition;
814int            i;
815/******************/
816network      = Ntk_HrcManagerReadCurrentNetwork(*hmgr);
817if(network == NIL(Ntk_Network_t))
818        return 1;
819fsm          = Fsm_HrcManagerReadCurrentFsm(*hmgr);
820if(fsm ==  NIL(Fsm_Fsm_t))
821        return 1;
822mddManager   = Fsm_FsmReadMddManager(fsm);
823
824
825
826/**********   Build cex  ***********/
827/* Here add the function           */
828/* that build the Bdd to and       */
829/* with the transtion relation     */
830/***********************************/
831rel = buildDummyBdd(mddManager);
832if(rel == NIL(mdd_t))
833{
834        fprintf(vis_stdout,"Problem when building the new relation bdd\n");
835        return 1;
836}
837if (verbose)
838  mdd_FunctionPrintMain (mddManager ,rel,"REL",vis_stdout);
839
840
841/** Get image_info **/
842Img_ImageInfo_t * imageInfo = Fsm_FsmReadOrCreateImageInfo(fsm,1,0);
843partition = Part_PartitionDuplicate(Fsm_FsmReadPartition(fsm));
844/**** The complete transtion relation ****/
845// array_t * transRelation = Img_GetPartitionedTransitionRelation(imageInfo, 0);
846/*****************************************/
847/*** For each latch rebuild the transition function ***/
848/*** mvf table is composed of mdd for each possible ***/
849/*** value of the latch                             ***/
850ImgFunctionData_t * functionData = &(imageInfo->functionData);
851array_t *roots = functionData->roots;
852array_t *rangeVarMddIdArray = functionData->rangeVars;
853char * nodeName;
854arrayForEachItem(char *, roots, i, nodeName) {
855 
856        /* The new relation */ 
857        vertex_t *vertex = Part_PartitionFindVertexByName(partition, nodeName);
858    Mvf_Function_t *mvf = Part_VertexReadFunction(vertex);
859    int mddId = array_fetch(int, rangeVarMddIdArray, i);
860        mdd_t *relation = Mvf_FunctionBuildRelationWithVariable(mvf, mddId);
861    if(verbose){
862      int x;
863      mdd_t * comp;
864
865      Mvf_FunctionForEachComponent( mvf, x, comp){
866        printf("%s,%d mdd %d ",nodeName,x,mddId);
867        mdd_FunctionPrintMain (mddManager ,comp,"MVF",vis_stdout);
868      }
869    }
870
871        mdd_t * n_relation = mdd_and(relation,rel,1,1);
872    /* Build for each possible value */
873        int nbValue = Mvf_FunctionReadNumComponents(mvf) ;
874        int v ;
875        Mvf_Function_t * newMvf = Mvf_FunctionAlloc(mddManager,nbValue);
876        for(v = 0; v<nbValue;v++)
877        {
878                 mdd_t * n_s1 =  mdd_eq_c(mddManager,mddId, v);
879                 mdd_t * n_rel_s1 = mdd_and(n_relation,n_s1,1,1);
880                 mdd_t * n_relation_s1 = mdd_cofactor_minterm(n_rel_s1,n_s1);
881                 Mvf_FunctionAddMintermsToComponent(newMvf,v,n_relation_s1);
882
883
884        }
885        /* Replace the function for the latch */
886        Part_VertexSetFunction(vertex, newMvf);
887//      printf("vertex %s changed % d\n",PartVertexReadName(vertex));
888}
889
890/** Change the fsm and the network with a new partition and the new fsm **/
891Ntk_NetworkSetApplInfo(network, PART_NETWORK_APPL_KEY,
892                                          (Ntk_ApplInfoFreeFn) Part_PartitionFreeCallback,
893                                          (void *) partition);
894fsm = Fsm_FsmCreateFromNetworkWithPartition(network, NIL(graph_t));
895mdd_t * init  = Fsm_FsmComputeInitialStates(fsm);
896mdd_t * reach = Fsm_FsmComputeReachableStates(fsm,0,verbose,
897                                      0,0, 0,
898                                      0, 0, Fsm_Rch_Default_c,
899                                      0,1, NIL(array_t),
900                                      (verbose > 0),  NIL(array_t));
901fsm->reachabilityInfo.initialStates = init;
902fsm->reachabilityInfo.reachableStates = reach;
903if(verbose)
904        Fsm_FsmReachabilityPrintResults(fsm,3, 0);
905
906Ntk_NetworkSetApplInfo(network, FSM_NETWORK_APPL_KEY,
907                         (Ntk_ApplInfoFreeFn) Fsm_FsmFreeCallback,
908                         (void *) fsm);
909
910return 0;               /* normal exit */
911
912usage:
913(void) fprintf(vis_stderr, "usage: _transition [-h] [-v]\n");
914(void) fprintf(vis_stderr, "   -h\t\tprint the command usage\n");
915(void) fprintf(vis_stderr, "   -v\t\tverbose\n");
916return 1;               /* error exit */
917
918}
919
920static int 
921CommandBuildCexBdd(Hrc_Manager_t ** hmgr,
922                   int  argc, char ** argv){
923int            c;
924int            verbose = 0;              /* default value */
925
926/*
927 * Parse command line options.
928 */
929util_getopt_reset();
930while ((c = util_getopt(argc, argv, "vh")) != EOF) {
931  switch(c) {
932    case 'v':
933      verbose = 1;
934      break;
935    case 'h':
936      goto usage;
937    default:
938      goto usage;
939  }
940}
941
942if (verbose) {
943  (void) fprintf(vis_stdout, "The _cexBdd is under construction.\n");
944}
945
946Fsm_Fsm_t      *fsm          = NIL(Fsm_Fsm_t);
947Ntk_Network_t  *network      = NIL(Ntk_Network_t);
948mdd_manager    *mddManager; 
949Hrc_Manager_t  *hmgrCex       = NIL(Hrc_Manager_t);
950Fsm_Fsm_t      *fsmCex        = NIL(Fsm_Fsm_t);
951Ntk_Network_t  *networkCex    = NIL(Ntk_Network_t);
952mdd_t          *rel           = NIL(mdd_t);
953int            i;
954/******************/
955network      = Ntk_HrcManagerReadCurrentNetwork(*hmgr);
956if(network == NIL(Ntk_Network_t))
957        return 1;
958fsm          = Fsm_HrcManagerReadCurrentFsm(*hmgr);
959if(fsm ==  NIL(Fsm_Fsm_t))
960        return 1;
961mddManager   = Fsm_FsmReadMddManager(fsm);
962
963mdd_t * initOrig  = Fsm_FsmComputeInitialStates(fsm);
964mdd_FunctionPrintMain (mddManager ,initOrig,"INIT_ORG",vis_stdout);
965
966/**********   Build cex  ***********/
967/* Here add the function           */
968/* that build the Bdd to and       */
969/* with the transtion relation     */
970/***********************************/
971//rel = buildDummyBdd(mddManager);
972 graph_t * part = Part_PartitionDuplicate(Fsm_FsmReadPartition(fsm));
973 vertex_t * v_s2 = Part_PartitionFindVertexByName(part, "cex.s2");
974Mvf_Function_t * newMvf  = Mvf_FunctionAlloc( mddManager,2);
975 mdd_t * s0 =  mdd_eq_c(mddManager,20, 0);
976 mdd_t * s1 =  mdd_eq_c(mddManager,22, 0);
977 mdd_t * state0 =  mdd_one(mddManager);
978 mdd_t * state1 =  mdd_one(mddManager);
979 state0 = mdd_and(s0,s1,1,1);
980 mdd_t * state12 = mdd_and(s0,s1,0,1);
981 state1 = mdd_not(state0);
982  array_insert(mdd_t *, newMvf, 1, state0);
983  array_insert(mdd_t *, newMvf, 0, state1);
984 mdd_t * ns1 =  mdd_eq_c(mddManager,17, 1);
985Mvf_Function_t * newNS  = Mvf_FunctionAlloc( mddManager,2);
986Mvf_FunctionAddMintermsToComponent(newNS,1, mdd_and(state0,ns1,1,1));
987Mvf_FunctionAddMintermsToComponent(newNS,0, mdd_and(state1,ns1,1,0));
988
989mdd_FunctionPrintMain(mddManager,Mvf_FunctionComputeDomain(newNS),"NS",vis_stdout);
990vertex_t * vert;
991vert = Part_PartitionFindVertexByName(part,"cex.s2");
992Part_VertexSetFunction(vert, newNS);
993
994vert = Part_PartitionFindVertexByName(part,"cex.s3");
995 mdd_t * ns1S3 =  mdd_eq_c(mddManager,14, 1);
996Mvf_Function_t * newS3  = Mvf_FunctionAlloc( mddManager,2);
997Mvf_FunctionAddMintermsToComponent(newS3,1, mdd_and(state12,ns1S3,1,1));
998Mvf_FunctionAddMintermsToComponent(newS3,0, mdd_and(state12,ns1S3,0,0));
999Part_VertexSetFunction(vert, newS3);
1000
1001// Initial state
1002mdd_t * ns1Init =  mdd_eq_c(mddManager,3, 1);
1003
1004Mvf_Function_t * newNSInit  = Mvf_FunctionAlloc(mddManager,2);
1005Mvf_FunctionAddMintermsToComponent(newNSInit,1, mdd_and(state0,ns1Init,1,1));
1006Mvf_FunctionAddMintermsToComponent(newNSInit,0, mdd_and(state1,ns1Init,1,0));
1007mdd_FunctionPrintMain(mddManager,Mvf_FunctionComputeDomain(newNSInit),"NSINIT",vis_stdout);
1008Part_VertexSetFunction(Part_PartitionFindVertexByName(part,"cex.s2$INIT"),
1009newNSInit);
1010
1011
1012
1013
1014 /** Change the fsm and the network with a new partition and the new fsm **/
1015Ntk_NetworkSetApplInfo(network, PART_NETWORK_APPL_KEY,
1016                                          (Ntk_ApplInfoFreeFn) Part_PartitionFreeCallback,
1017                                          (void *) part);
1018fsm = Fsm_FsmCreateFromNetworkWithPartition(network, part);
1019
1020
1021mdd_t * init  = Fsm_FsmComputeInitialStates(fsm);
1022//mdd_t * n_init =  Mvf_MddComposeWithFunction(init, 17 , newMvf);
1023mdd_t * reach = Fsm_FsmComputeReachableStates(fsm,0,verbose,
1024                                      0,0, 0,
1025                                      0, 0, Fsm_Rch_Default_c,
1026                                      0,1, NIL(array_t),
1027                                      (verbose > 0),  NIL(array_t));
1028fsm->reachabilityInfo.initialStates = init;
1029fsm->reachabilityInfo.reachableStates = reach;
1030       
1031   
1032   
1033Ntk_NetworkSetApplInfo(network, FSM_NETWORK_APPL_KEY,
1034                         (Ntk_ApplInfoFreeFn) Fsm_FsmFreeCallback,
1035                         (void *) fsm); 
1036
1037Img_ImageInfoUpdateVariables(fsm->imageInfo,
1038                                 fsm->partition,
1039                                 fsm->fsmData.presentStateVars,
1040                                 fsm->fsmData.inputVars,
1041                                 fsm->fsmData.presentStateCube,
1042                                 fsm->fsmData.inputCube);
1043Fsm_FsmReachabilityPrintResults(fsm,3, 0);
1044//
1045//
1046mdd_FunctionPrintMain (mddManager ,init,"INIT",vis_stdout);
1047
1048/*
1049// Read_blif_mv
1050  FILE *fpC;
1051  fpC = Cmd_FileOpen("cex.mv", "r", NIL(char *), 1);
1052  boolean isCanonicalC = 0;
1053  boolean isIncrementalC = 0;
1054  boolean isVerboseC = 0;
1055  hmgrCex =  Io_BlifMvRead(fpC,hmgrCex,isCanonicalC,isIncrementalC,isVerboseC);
1056
1057//flatten_hier
1058  lsList         varNameList = (lsList) NULL;
1059  Hrc_Node_t    *currentNode = Hrc_ManagerReadCurrentNode(hmgrCex);
1060  networkCex = Ntk_HrcNodeConvertToNetwork(currentNode, TRUE, varNameList);
1061  Ntk_NetworkSetMddManager(networkCex, mddManager);
1062//static_order
1063  static Ord_NodeMethod nodeMethod = Ord_NodesByDefault_c;;
1064  static Ord_RootMethod rootMethod = Ord_RootsByDefault_c;
1065  static Ord_OrderType  suppliedOrderType = Ord_Unassigned_c;
1066  static Ord_OrderType  generatedOrderType = Ord_InputAndLatch_c;
1067  static boolean        nsAfterSupport = FALSE;
1068  lsList                suppliedNodeList = (lsList) NULL;
1069
1070 Ord_NetworkOrderVariables(networkCex, rootMethod, nodeMethod, nsAfterSupport,
1071                            generatedOrderType, suppliedOrderType,
1072                            suppliedNodeList, isVerboseC);
1073 //build_partition_mdd
1074 char * modelName = Hrc_NodeReadModelName(currentNode);
1075 static Part_PartitionMethod method = Part_Default_c;
1076 graph_t                     *partition;
1077 lsList                      nodeList = lsCreate();
1078 boolean inTermsOfLeaves = FALSE;
1079 partition = Part_NetworkCreatePartition(networkCex, currentNode, modelName, (lsList)0,
1080                                          (lsList)0, NIL(mdd_t), method, nodeList,
1081                                          inTermsOfLeaves, isVerboseC, 0);
1082//    PartPartitionPrint(vis_stdout, partition);
1083  printf(" Cex loaded \n");
1084fsmCex          =  Fsm_FsmCreateFromNetworkWithPartition(networkCex, partition);
1085array_t * nextNamesCex = Fsm_FsmReadNextStateFunctionNames(fsmCex);
1086array_t * nextIdsCex =   Fsm_FsmReadNextStateVars(fsmCex);
1087printf("Next Names\n");
1088printStringArray(nextNamesCex);
1089printf("Next Ids\n");
1090printIntArray(nextIdsCex);
1091
1092mddManager =  Fsm_FsmReadMddManager(fsm);
1093mdd_manager * mddManagerCex =  Fsm_FsmReadMddManager(fsmCex);
1094
1095array_t *mvar_list, *bvar_list;
1096mvar_list = mdd_ret_mvar_list(mddManager);
1097bvar_list = mdd_ret_bvar_list(mddManager);
1098printf("Number of mdd %d , %d\n", array_n(mvar_list),array_n(bvar_list));
1099printf("mddManager = %p mddMangerCex %p \n",mddManager,mddManagerCex);
1100 //mdd_t * init = Fsm_FsmComputeInitialStates(fsmCex);
1101// mdd_FunctionPrintMain (mddManagerCex ,init,"REL",vis_stdout);
1102graph_t * part = Fsm_FsmReadPartition(fsm);
1103printf(" modele %s , cex %s \n",Part_PartitionReadName(part), Part_PartitionReadName(partition));
1104*/
1105return 0;               /* normal exit */
1106
1107usage:
1108(void) fprintf(vis_stderr, "usage: _BddCex [-h] [-v]\n");
1109(void) fprintf(vis_stderr, "   -h\t\tprint the command usage\n");
1110(void) fprintf(vis_stderr, "   -v\t\tverbose\n");
1111return 1;               /* error exit */
1112
1113}
1114
1115
Note: See TracBrowser for help on using the repository browser.