00001
00002
00045
00046
00047 #ifndef CCuddCore_h
00048 #define CCuddCore_h
00049
00050
00051 #include "pbori_defs.h"
00052
00053
00054 #include <boost/intrusive_ptr.hpp>
00055
00056
00057 #include "pbori_func.h"
00058 #include "pbori_traits.h"
00059
00060 #include "CVariableNames.h"
00061
00062 #include <vector>
00063 #include "cuddInt.h"
00064
00065 BEGIN_NAMESPACE_PBORI
00066
00078 class CCuddCore {
00079
00080 public:
00082 PB_DECLARE_CUDD_TYPES(mgrcore_traits<Cudd>)
00083
00084
00085 typedef CCuddCore self;
00086
00088 typedef boost::intrusive_ptr<self> mgrcore_ptr;
00089
00091 typedef CVariableNames variable_names_type;
00092
00094 typedef variable_names_type::const_reference const_varname_reference;
00095
00097 mgrcore_type manager;
00098
00100 static errorfunc_type errorHandler;
00101
00103 static bool verbose;
00104
00106 refcount_type ref;
00107
00109 variable_names_type m_names;
00110
00111 std::vector<node_type> m_vars;
00112
00114 CCuddCore(size_type numVars = 0,
00115 size_type numVarsZ = 0,
00116 size_type numSlots = CUDD_UNIQUE_SLOTS,
00117 size_type cacheSize = CUDD_CACHE_SLOTS,
00118 large_size_type maxMemory = 0):
00119 ref(0), m_names(numVarsZ), m_vars(numVarsZ) {
00120 manager = Cudd_Init(numVars,numVarsZ,numSlots,cacheSize,maxMemory);
00121
00122
00123 for (unsigned idx = 0 ; idx < numVarsZ; ++idx) {
00124 m_vars[idx] = cuddUniqueInterZdd(manager, idx, DD_ONE(manager),
00125 DD_ZERO(manager));
00126 Cudd_Ref(m_vars[idx]);
00127 }
00128
00129 }
00130
00132 ~CCuddCore(){ release(); }
00133
00135 void addRef(){ ++ref; }
00136
00138 void release() {
00139 if (--(ref) == 0){
00140 for (std::vector<node_type>::iterator iter = m_vars.begin(); iter !=
00141 m_vars.end(); ++iter) {
00142
00143 Cudd_RecursiveDerefZdd(manager, *iter);
00144 }
00145
00146
00147 int retval = Cudd_CheckZeroRef(manager);
00148 if UNLIKELY(retval != 0) {
00149 std::cerr << retval << " unexpected non-zero reference counts\n";
00150 } else if (verbose) {
00151 std::cerr << "All went well\n";
00152 }
00153 Cudd_Quit(manager);
00154 }
00155 }
00156 };
00157
00159
00160
00161 inline void
00162 intrusive_ptr_add_ref(CCuddCore* pCore){
00163 pCore->addRef();
00164 }
00165
00167 inline void
00168 intrusive_ptr_release(CCuddCore* pCore) {
00169 pCore->release();
00170 }
00172
00173 END_NAMESPACE_PBORI
00174
00175 #endif
00176
00177