00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00037 #ifndef __NUSMV_CORE_RBC_RBC_H__
00038 #define __NUSMV_CORE_RBC_RBC_H__
00039
00040
00041 #if HAVE_CONFIG_H
00042 # include "nusmv-config.h"
00043 #endif
00044
00045
00046 #if NUSMV_HAVE_MALLOC_H
00047 # if NUSMV_HAVE_SYS_TYPES_H
00048 # include <sys/types.h>
00049 # endif
00050 # include <malloc.h>
00051 #elif defined(NUSMV_HAVE_SYS_MALLOC_H) && NUSMV_HAVE_SYS_MALLOC_H
00052 # if NUSMV_HAVE_SYS_TYPES_H
00053 # include <sys/types.h>
00054 # endif
00055 # include <sys/malloc.h>
00056 #elif NUSMV_HAVE_STDLIB_H
00057 # include <stdlib.h>
00058 #endif
00059
00060 #include <stdio.h>
00061
00062
00063 #include "nusmv/core/dag/dag.h"
00064 #include "nusmv/core/utils/Slist.h"
00065 #include "nusmv/core/cinit/NuSMVEnv.h"
00066
00067
00068
00069
00070
00076 #define RBC_TSEITIN_CONVERSION_NAME "tseitin"
00077
00083 #define RBC_SHERIDAN_CONVERSION_NAME "sheridan"
00084
00090 #define RBC_INVALID_CONVERSION_NAME "invalid"
00091
00092
00093
00094
00095
00102 typedef enum _Rbc_2CnfAlgorithm {
00103 RBC_INVALID_CONVERSION = 0,
00104 RBC_TSEITIN_CONVERSION,
00105 RBC_SHERIDAN_CONVERSION
00106 } Rbc_2CnfAlgorithm;
00107
00114 typedef enum Rbc_Bool {
00115 RBC_FALSE = DAG_ANNOTATION_BIT,
00116 RBC_TRUE = 0
00117 } Rbc_Bool_c;
00118
00125 typedef struct RbcManager Rbc_Manager_t;
00126
00132 typedef Dag_Vertex_t Rbc_t;
00133
00139 typedef Dag_DfsFunctions_t RbcDfsFunctions_t;
00140
00146 typedef void (*Rbc_ProcPtr_t)(void);
00147
00153 typedef int (*Rbc_IntPtr_t)(void);
00154
00155
00156
00157
00158 struct RbcDfsFunctions {
00159 Rbc_IntPtr_t Set;
00160 Rbc_ProcPtr_t FirstVisit;
00161 Rbc_ProcPtr_t BackVisit;
00162 Rbc_ProcPtr_t LastVisit;
00163 };
00164
00165
00166
00167
00168
00169
00170
00171
00177 #define RBC_INVALID_SUBST_VALUE \
00178 INT_MAX
00179
00180
00181
00182
00183
00184
00190 void Rbc_pkg_init(void);
00191
00197 void Rbc_pkg_quit(void);
00198
00216 int Rbc_Convert2Cnf(Rbc_Manager_t* rbcManager, Rbc_t* f,
00217 int polarity, Rbc_2CnfAlgorithm alg,
00218
00219 Slist_ptr clauses, Slist_ptr vars,
00220 int* literalAssignedToWholeFormula);
00221
00230 int Rbc_CnfVar2RbcIndex(Rbc_Manager_t* rbcManager, int cnfVar);
00231
00239 int Rbc_RbcIndex2CnfVar(Rbc_Manager_t* rbcManager, int rbcIndex);
00240
00248 Rbc_t* Rbc_GetOne(Rbc_Manager_t* rbcManager);
00249
00257 Rbc_t* Rbc_GetZero(Rbc_Manager_t* rbcManager);
00258
00265 boolean Rbc_IsConstant(Rbc_Manager_t* manager, Rbc_t* f);
00266
00282 Rbc_t* Rbc_GetIthVar(Rbc_Manager_t* rbcManager, int varIndex);
00283
00291 Rbc_t* Rbc_MakeNot(Rbc_Manager_t* rbcManager, Rbc_t* left);
00292
00315 Rbc_t* Rbc_MakeAnd(Rbc_Manager_t* rbcManager, Rbc_t* left, Rbc_t* right, Rbc_Bool_c sign);
00316
00325 Rbc_t* Rbc_MakeOr(Rbc_Manager_t* rbcManager, Rbc_t* left, Rbc_t* right, Rbc_Bool_c sign);
00326
00345 Rbc_t* Rbc_MakeIff(Rbc_Manager_t* rbcManager, Rbc_t* left, Rbc_t* right, Rbc_Bool_c sign);
00346
00355 Rbc_t* Rbc_MakeXor(Rbc_Manager_t* rbcManager, Rbc_t* left, Rbc_t* right, Rbc_Bool_c sign);
00356
00368 Rbc_t* Rbc_MakeIte(Rbc_Manager_t* rbcManager, Rbc_t* c, Rbc_t* t, Rbc_t* e,
00369 Rbc_Bool_c sign);
00370
00378 Rbc_t* Rbc_GetLeftOpnd(Rbc_t* f);
00379
00387 Rbc_t* Rbc_GetRightOpnd(Rbc_t* f);
00388
00397 int Rbc_GetVarIndex(Rbc_t* f);
00398
00407 void Rbc_Mark(Rbc_Manager_t* rbc, Rbc_t* f);
00408
00417 void Rbc_Unmark(Rbc_Manager_t* rbc, Rbc_t* f);
00418
00434 Rbc_Manager_t* Rbc_ManagerAlloc(const NuSMVEnv_ptr env, int varCapacity);
00435
00444 void Rbc_ManagerReserve(Rbc_Manager_t* rbcManager, int newVarCapacity);
00445
00453 void Rbc_ManagerReset(Rbc_Manager_t* rbcManager);
00454
00463 int Rbc_ManagerCapacity(Rbc_Manager_t* rbcManager);
00464
00472 void Rbc_ManagerFree(Rbc_Manager_t* rbcManager);
00473
00481 void Rbc_ManagerGC(Rbc_Manager_t* rbcManager);
00482
00488 NuSMVEnv_ptr Rbc_ManagerGetEnvironment(Rbc_Manager_t* rbcManager);
00489
00497 void
00498 Rbc_OutputDaVinci(Rbc_Manager_t* rbcManager, Rbc_t* f, FILE* outFile);
00499
00507 void
00508 Rbc_OutputSexpr(Rbc_Manager_t* rbcManager, Rbc_t* f, FILE* outFile);
00509
00517 void
00518 Rbc_OutputGdl(Rbc_Manager_t* rbcManager, Rbc_t* f, FILE* outFile);
00519
00556 Rbc_t*
00557 Rbc_Subst(Rbc_Manager_t* rbcManager, Rbc_t* f, int* subst);
00558
00592 Rbc_t* Rbc_LogicalSubst(Rbc_Manager_t* rbcManager, Rbc_t* f,
00593 int* subst, const int* log2phy,
00594 const int* phy2log);
00595
00621 Rbc_t* Rbc_Shift(Rbc_Manager_t* rbcManager, Rbc_t* f, int shift);
00622
00648 Rbc_t*
00649 Rbc_LogicalShift(Rbc_Manager_t* rbcManager, Rbc_t* f,
00650 int shift, const int* log2phy, const int* phy2log);
00651
00671 Rbc_t*
00672 Rbc_SubstRbc(Rbc_Manager_t* rbcManager, Rbc_t* f, Rbc_t** substRbc);
00673
00701 Rbc_t*
00702 Rbc_LogicalSubstRbc(Rbc_Manager_t* rbcManager, Rbc_t* f,
00703 Rbc_t** substRbc, int* phy2log);
00704
00712 void
00713 Rbc_PrintStats(Rbc_Manager_t* rbcManager, int clustSz, FILE* outFile);
00714
00722 Slist_ptr
00723 RbcUtils_get_dependencies(Rbc_Manager_t* rbcManager, Rbc_t* f,
00724 boolean reset_dag);
00725
00736 struct InlineResult_TAG*
00737 RbcInline_apply_inlining(Rbc_Manager_t* rbcm, Rbc_t* f);
00738
00744 Rbc_2CnfAlgorithm
00745 Rbc_CnfConversionAlgorithmFromStr(const char* str);
00746
00752 const char *
00753 Rbc_CnfConversionAlgorithm2Str(Rbc_2CnfAlgorithm algo);
00754
00760 const char *
00761 Rbc_CnfGetValidRbc2CnfAlgorithms(void);
00762
00768 boolean Rbc_is_top(Rbc_t* rbc);
00769
00775 boolean Rbc_is_var(Rbc_t* rbc);
00776
00782 boolean Rbc_is_and(Rbc_t* rbc);
00783
00789 boolean Rbc_is_iff(Rbc_t* rbc);
00790
00796 boolean Rbc_is_ite(Rbc_t* rbc);
00797
00803 RbcDfsFunctions_t*
00804 Rbc_ManagerGetDfsCleanFun(Rbc_Manager_t* rbcManager);
00805
00813 void Rbc_Dfs_exported(Rbc_t* dfsRoot,
00814 RbcDfsFunctions_t* dfsFun,
00815 void* dfsData,
00816 Rbc_Manager_t* manager);
00817
00825 void Rbc_Dfs_clean_exported(Rbc_t* dfsRoot,
00826 Rbc_Manager_t* manager);
00827
00828 #endif