| [10] | 1 | // /********************************************************************* |
|---|
| 2 | // Copyright 2000-2004, Princeton University. All rights reserved. |
|---|
| 3 | // By using this software the USER indicates that he or she has read, |
|---|
| 4 | // understood and will comply with the following: |
|---|
| 5 | // |
|---|
| 6 | // --- Princeton University hereby grants USER nonexclusive permission |
|---|
| 7 | // to use, copy and/or modify this software for internal, noncommercial, |
|---|
| 8 | // research purposes only. Any distribution, including commercial sale |
|---|
| 9 | // or license, of this software, copies of the software, its associated |
|---|
| 10 | // documentation and/or modifications of either is strictly prohibited |
|---|
| 11 | // without the prior consent of Princeton University. Title to copyright |
|---|
| 12 | // to this software and its associated documentation shall at all times |
|---|
| 13 | // remain with Princeton University. Appropriate copyright notice shall |
|---|
| 14 | // be placed on all software copies, and a complete copy of this notice |
|---|
| 15 | // shall be included in all copies of the associated documentation. |
|---|
| 16 | // No right is granted to use in advertising, publicity or otherwise |
|---|
| 17 | // any trademark, service mark, or the name of Princeton University. |
|---|
| 18 | // |
|---|
| 19 | // |
|---|
| 20 | // --- This software and any associated documentation is provided "as is" |
|---|
| 21 | // |
|---|
| 22 | // PRINCETON UNIVERSITY MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS |
|---|
| 23 | // OR IMPLIED, INCLUDING THOSE OF MERCHANTABILITY OR FITNESS FOR A |
|---|
| 24 | // PARTICULAR PURPOSE, OR THAT USE OF THE SOFTWARE, MODIFICATIONS, OR |
|---|
| 25 | // ASSOCIATED DOCUMENTATION WILL NOT INFRINGE ANY PATENTS, COPYRIGHTS, |
|---|
| 26 | // TRADEMARKS OR OTHER INTELLECTUAL PROPERTY RIGHTS OF A THIRD PARTY. |
|---|
| 27 | // |
|---|
| 28 | // Princeton University shall not be liable under any circumstances for |
|---|
| 29 | // any direct, indirect, special, incidental, or consequential damages |
|---|
| 30 | // with respect to any claim by USER or any third party on account of |
|---|
| 31 | // or arising from the use, or inability to use, this software or its |
|---|
| 32 | // associated documentation, even if Princeton University has been advised |
|---|
| 33 | // of the possibility of those damages. |
|---|
| 34 | // *********************************************************************/ |
|---|
| 35 | |
|---|
| 36 | #ifndef __SAT_HEADER__ |
|---|
| 37 | #define __SAT_HEADER__ |
|---|
| 38 | |
|---|
| 39 | #define SAT_Manager void * |
|---|
| 40 | |
|---|
| 41 | typedef long long long64; // this is for 32 bit unix machines |
|---|
| 42 | // typedef long long64; // this is for Windows or 64 bit unix machines |
|---|
| 43 | |
|---|
| 44 | |
|---|
| 45 | #ifndef _SAT_STATUS_ |
|---|
| 46 | #define _SAT_STATUS_ |
|---|
| 47 | enum SAT_StatusT { |
|---|
| 48 | UNDETERMINED, |
|---|
| 49 | UNSATISFIABLE, |
|---|
| 50 | SATISFIABLE, |
|---|
| 51 | TIME_OUT, |
|---|
| 52 | MEM_OUT, |
|---|
| 53 | ABORTED |
|---|
| 54 | }; |
|---|
| 55 | #endif |
|---|
| 56 | |
|---|
| 57 | #ifndef _CLS_STATUS_ |
|---|
| 58 | #define _CLS_STATUS_ |
|---|
| 59 | enum CLAUSE_STATUS { |
|---|
| 60 | ORIGINAL_CL, |
|---|
| 61 | CONFLICT_CL, |
|---|
| 62 | DELETED_CL, |
|---|
| 63 | }; |
|---|
| 64 | #endif |
|---|
| 65 | |
|---|
| 66 | #ifndef UNKNOWN |
|---|
| 67 | #define UNKNOWN 2 |
|---|
| 68 | #endif |
|---|
| 69 | |
|---|
| 70 | // /*============================================================ |
|---|
| 71 | // |
|---|
| 72 | // This is the header for using the sat solver. A typical flow is |
|---|
| 73 | // |
|---|
| 74 | // 1. calling SAT_InitManager to get a new manager. You can pre-set |
|---|
| 75 | // the number of variables upfront, or you can add it later by |
|---|
| 76 | // SAT_AddVariable. |
|---|
| 77 | // Variables are indexed from 1, NOT 0. |
|---|
| 78 | // |
|---|
| 79 | // 2. add clauses by calling SAT_AddClause. Clause is represented by |
|---|
| 80 | // an array of integers. Each literal is represented by |
|---|
| 81 | // 2 * VarIndex + Sign. The Sign is 0 for positive phased literals, |
|---|
| 82 | // and 1 for negative phased literals. |
|---|
| 83 | // For example, a clause (3 -5 11 -4 ) should be represented by |
|---|
| 84 | // { 6, 11, 22, 9 } |
|---|
| 85 | // Note: Each variable can occure no more than once in a clause. |
|---|
| 86 | // if a variable occures in both phase, the clause is automatically |
|---|
| 87 | // satisfied. If more than one occurance with same phase, they |
|---|
| 88 | // should be combined. IT IS YOUR RESPONSIBILITY TO KEEP EACH |
|---|
| 89 | // CLAUSE NON-REDUNDENT, or the solver will not function correctly. |
|---|
| 90 | // |
|---|
| 91 | // 3. zchaff support incremental SAT solving. Clauses can be added |
|---|
| 92 | // or deleted from the database after each run. To accomplish |
|---|
| 93 | // this, a clause is associated with a "Group ID". Each clause |
|---|
| 94 | // has one Group ID. The group of clauses with the same GID can |
|---|
| 95 | // be deleted from the database by calling SAT_DeleteClauseGroup |
|---|
| 96 | // after each run. You need to call SAT_Reset to reset the state |
|---|
| 97 | // of the solver before begining a new run. |
|---|
| 98 | // As an example, the first 10 clauses are associated with GID 1, |
|---|
| 99 | // We add another 2 clauses with GID 2. After solving this instance |
|---|
| 100 | // with 12 clauses, we may want to delete the last 2 clauses and |
|---|
| 101 | // add another 3 clauses. We call SAT_DeleteClauseGroup with GID |
|---|
| 102 | // 2 and add the three clauses (these three clauses can have any |
|---|
| 103 | // GID: either 1 if you don't want to delete them in the future, |
|---|
| 104 | // 2 if you want to distinguish them from Group 1). Then you should |
|---|
| 105 | // call SAT_Reset() to reset the state of the solver, and call |
|---|
| 106 | // SAT_Solve() again to solve the new instance (a instance with |
|---|
| 107 | // 13 clauses). |
|---|
| 108 | // You should obtain free GID using SAT_AllocClauseGroupID. When |
|---|
| 109 | // you call SAT_DeleteClauseGroup, the gid will be freed and can |
|---|
| 110 | // be re-used when you call SAT_AllocClauseGroupID() again. |
|---|
| 111 | // You can also merge two group of clauses into 1 by calling |
|---|
| 112 | // corresponding functions. |
|---|
| 113 | // |
|---|
| 114 | // 4. Optionally, you may set the time limit and memory limit for |
|---|
| 115 | // the solver, note: time and memory limits are not exact. |
|---|
| 116 | // Also, you can set other paramenters like clause deletion |
|---|
| 117 | // etc. |
|---|
| 118 | // |
|---|
| 119 | // 5. You can add hook function to do some extra work after |
|---|
| 120 | // a certain number of decisions (branchings). A hook function |
|---|
| 121 | // should accept input of a manager, and has no return value. |
|---|
| 122 | // |
|---|
| 123 | // 6. Calling SAT_Solve to solve the problem. it will return the |
|---|
| 124 | // status of the solver. |
|---|
| 125 | // |
|---|
| 126 | // 7. If the problem is satisfiable, you can call SAT_GetVarAsgnment |
|---|
| 127 | // to get a variable assignment which satisfy the problem. |
|---|
| 128 | // |
|---|
| 129 | // 8. You can also get some statistics from the solver, such as |
|---|
| 130 | // run time, mem usage, etc. |
|---|
| 131 | // |
|---|
| 132 | // 9. Release the manager by calling SAT_ReleaseManager. |
|---|
| 133 | // |
|---|
| 134 | // You need to link the library libsat.a, also, though you can compile |
|---|
| 135 | // your C program with c compiler when using this sat solver, you |
|---|
| 136 | // still need c++ linker to link the library. |
|---|
| 137 | // |
|---|
| 138 | // Have fun. |
|---|
| 139 | // The Chaff Team |
|---|
| 140 | // (contact zfu@EE.Princeton.EDU |
|---|
| 141 | // for any questions or suggestions) |
|---|
| 142 | // 2004. 3. 10 |
|---|
| 143 | // =============================================================*/ |
|---|
| 144 | |
|---|
| 145 | |
|---|
| 146 | // Following are the main functions for the flow. |
|---|
| 147 | |
|---|
| 148 | // init a manager |
|---|
| 149 | SAT_Manager SAT_InitManager(void); |
|---|
| 150 | |
|---|
| 151 | // get the version of the solver |
|---|
| 152 | char * SAT_Version(SAT_Manager mng); |
|---|
| 153 | |
|---|
| 154 | // release a manager |
|---|
| 155 | void SAT_ReleaseManager(SAT_Manager mng); |
|---|
| 156 | |
|---|
| 157 | // set the number of variables. |
|---|
| 158 | void SAT_SetNumVariables(SAT_Manager mng, |
|---|
| 159 | int num_vars); |
|---|
| 160 | |
|---|
| 161 | // add a variable. it will return the new var's index |
|---|
| 162 | int SAT_AddVariable(SAT_Manager mng); |
|---|
| 163 | |
|---|
| 164 | // the following functions will allow/disallow the variable to be branched |
|---|
| 165 | // user may want to branch only on certain variables (for example, primary |
|---|
| 166 | // inputs of a circuit, if the CNF is generated from circuit). |
|---|
| 167 | // By default, all variables are branchable, usually, if a variable is |
|---|
| 168 | // unbranchable, it's value should be determined by all the branchable variables. |
|---|
| 169 | // if that's not the case, then these variables may not get an assigned |
|---|
| 170 | // value even if the solver says that the problem is satisfiable. |
|---|
| 171 | // Notice, the solver determines if a problem is satisfiable by trying to assign |
|---|
| 172 | // all the branchable variables. If all such variables can be assigned values |
|---|
| 173 | // without causing conflict, then the instance is reported as satisfiable, even |
|---|
| 174 | // if the instance is actually unsatisfiable because of unbranchable |
|---|
| 175 | // variables being not dependent on branchable variables. |
|---|
| 176 | void SAT_EnableVarBranch(SAT_Manager mng, int vid); |
|---|
| 177 | |
|---|
| 178 | void SAT_DisableVarBranch(SAT_Manager mng, int vid); |
|---|
| 179 | // add a clause. a literal is a integer with value 2*V_idx + sign |
|---|
| 180 | // gid is the group ID. by default, gid equals 0 . Note: group 0 |
|---|
| 181 | // clauses can't be deleted. |
|---|
| 182 | void SAT_AddClause(SAT_Manager mng, |
|---|
| 183 | int * clause_lits, |
|---|
| 184 | int num_lits, |
|---|
| 185 | int gid = 0); |
|---|
| 186 | |
|---|
| 187 | // delete a clause group and learned clauses depending on them. |
|---|
| 188 | void SAT_DeleteClauseGroup(SAT_Manager mng, |
|---|
| 189 | int gid); |
|---|
| 190 | |
|---|
| 191 | // This will reset the solver so it will not keep the implications made before |
|---|
| 192 | void SAT_Reset(SAT_Manager mng); |
|---|
| 193 | |
|---|
| 194 | // merge the clause group gid1 with gid2, return a new group which |
|---|
| 195 | // contain both groups. |
|---|
| 196 | int SAT_MergeClauseGroup(SAT_Manager mng, |
|---|
| 197 | int gid1, |
|---|
| 198 | int gid2); |
|---|
| 199 | |
|---|
| 200 | // Allocate a free clause group id. will be -1 if no more available. |
|---|
| 201 | // current implementation allow 32 deletable group IDs ranging from |
|---|
| 202 | // 1-32. Group 0 is the permanent group (i.e. can't delete). |
|---|
| 203 | int SAT_AllocClauseGroupID(SAT_Manager mng); |
|---|
| 204 | |
|---|
| 205 | // followings are for clause gid manipulation |
|---|
| 206 | int SAT_IsSetClauseGroupID(SAT_Manager mng, int cl_idx, int id); |
|---|
| 207 | int SAT_SetClauseGroupID(SAT_Manager mng, int cl_idx, int id); |
|---|
| 208 | int SAT_ClearClauseGroupID(SAT_Manager mng, int cl_idx, int id); |
|---|
| 209 | // clauses belong to volatile group will always be deleted when |
|---|
| 210 | // SAT_DeleteClauseGroup is called |
|---|
| 211 | int SAT_GetVolatileGroupID(SAT_Manager mng); |
|---|
| 212 | // clauses belong to global group will never be deleted |
|---|
| 213 | int SAT_GetGlobalGroupID(SAT_Manager mng); |
|---|
| 214 | |
|---|
| 215 | |
|---|
| 216 | void SAT_SetTimeLimit(SAT_Manager mng, |
|---|
| 217 | float runtime); |
|---|
| 218 | |
|---|
| 219 | // note: memory estimation is very rough, so allow 30% of error |
|---|
| 220 | // in both SetMemLimit and EstimateMemUsage. Also, in the run |
|---|
| 221 | // time, the memory usage could be temporarily 50% larger than |
|---|
| 222 | // the limit (this occours when program reallocate memory because |
|---|
| 223 | // of insufficiency in the initial allocation). |
|---|
| 224 | void SAT_SetMemLimit(SAT_Manager mng, |
|---|
| 225 | int num_bytes); |
|---|
| 226 | |
|---|
| 227 | |
|---|
| 228 | int SAT_Solve(SAT_Manager mng); |
|---|
| 229 | // enum SAT_StatusT |
|---|
| 230 | // Get a variable's assignment. -1 means UNKNOWN or undicided |
|---|
| 231 | int SAT_GetVarAsgnment(SAT_Manager mng, |
|---|
| 232 | int v_idx); |
|---|
| 233 | |
|---|
| 234 | // this is used for randomness in decision making |
|---|
| 235 | void SAT_SetRandomness(SAT_Manager mng, |
|---|
| 236 | int n); |
|---|
| 237 | // if the seed < 0, solver will use the day timer to |
|---|
| 238 | // get a "psuedo real random" seed. |
|---|
| 239 | void SAT_SetRandSeed(SAT_Manager mng, |
|---|
| 240 | int seed); |
|---|
| 241 | |
|---|
| 242 | // add a hookfunction. This function will be called |
|---|
| 243 | // every "interval" of decisions. You can add more than |
|---|
| 244 | // one such hook functions. i.e. call SAT_AddHookFun more |
|---|
| 245 | // than once. |
|---|
| 246 | void SAT_AddHookFun(SAT_Manager mng, |
|---|
| 247 | void (*fun)(void *), |
|---|
| 248 | int interval); |
|---|
| 249 | |
|---|
| 250 | // /* ======================================================= |
|---|
| 251 | // This function is for users who want to customize their own |
|---|
| 252 | // decision making strategy. |
|---|
| 253 | // |
|---|
| 254 | // What you can do is add a hook function with interval of 1, |
|---|
| 255 | // that function will be called before every decision. Inside |
|---|
| 256 | // this hook function, use SAT_MakeDecision to make decision |
|---|
| 257 | // with variable "vid" and "sign". sign = 1 means value of |
|---|
| 258 | // the variable be 0. |
|---|
| 259 | // |
|---|
| 260 | // If there are no free variable left, problem is satisfied, |
|---|
| 261 | // call SAT_MakeDecision with vid = 0 && sign = 0 will cause |
|---|
| 262 | // solver exit with status "SATISFIABLE". |
|---|
| 263 | // |
|---|
| 264 | // Here is an example: |
|---|
| 265 | // |
|---|
| 266 | // void my_own_decision (SAT_Manager mng) |
|---|
| 267 | // { |
|---|
| 268 | // int n_var = SAT_NumVariables(mng); |
|---|
| 269 | // int i; |
|---|
| 270 | // for (i=1; i<n_var; ++i) { |
|---|
| 271 | // if (SAT_GetVarAsgnment(mng, i)==UNKNOWN){ |
|---|
| 272 | // SAT_MakeDecision(mng, i, 1); //make decision with value 0; |
|---|
| 273 | // break; |
|---|
| 274 | // } |
|---|
| 275 | // } |
|---|
| 276 | // if (i >= n_var) //every var got an assignment, no free var left |
|---|
| 277 | // SAT_MakeDecision (mng, 0, 0); |
|---|
| 278 | // } |
|---|
| 279 | // ======================================================== */ |
|---|
| 280 | void SAT_MakeDecision(SAT_Manager mng, |
|---|
| 281 | int vid, |
|---|
| 282 | int sign); |
|---|
| 283 | |
|---|
| 284 | // Following are statistics collecting functions |
|---|
| 285 | int SAT_EstimateMemUsage(SAT_Manager mng); |
|---|
| 286 | // time elapsed from last call of GetElapsedCPUTime |
|---|
| 287 | float SAT_GetElapsedCPUTime(SAT_Manager mng); |
|---|
| 288 | // current cpu time |
|---|
| 289 | float SAT_GetCurrentCPUTime(SAT_Manager mng); |
|---|
| 290 | // time spent on the whole solving process |
|---|
| 291 | float SAT_GetCPUTime(SAT_Manager mng); |
|---|
| 292 | |
|---|
| 293 | int SAT_NumLiterals(SAT_Manager mng); |
|---|
| 294 | |
|---|
| 295 | int SAT_NumClauses(SAT_Manager mng); |
|---|
| 296 | |
|---|
| 297 | int SAT_NumVariables(SAT_Manager mng); |
|---|
| 298 | |
|---|
| 299 | int SAT_InitNumLiterals(SAT_Manager mng); |
|---|
| 300 | |
|---|
| 301 | int SAT_InitNumClauses(SAT_Manager mng); |
|---|
| 302 | |
|---|
| 303 | long64 SAT_NumAddedLiterals(SAT_Manager mng); |
|---|
| 304 | |
|---|
| 305 | int SAT_NumAddedClauses(SAT_Manager mng); |
|---|
| 306 | |
|---|
| 307 | int SAT_NumShrinkings(SAT_Manager mng); |
|---|
| 308 | |
|---|
| 309 | int SAT_NumDeletedClauses(SAT_Manager mng); |
|---|
| 310 | |
|---|
| 311 | int SAT_NumDelOrigCls(SAT_Manager mng); |
|---|
| 312 | |
|---|
| 313 | long64 SAT_NumDeletedLiterals(SAT_Manager mng); |
|---|
| 314 | |
|---|
| 315 | int SAT_NumDecisions(SAT_Manager mng); |
|---|
| 316 | int SAT_NumDecisionsStackConf(SAT_Manager mng); |
|---|
| 317 | int SAT_NumDecisionsVsids(SAT_Manager mng); |
|---|
| 318 | int SAT_NumDecisionsShrinking(SAT_Manager mng); |
|---|
| 319 | |
|---|
| 320 | |
|---|
| 321 | int SAT_Random_Seed(SAT_Manager mng); |
|---|
| 322 | |
|---|
| 323 | long64 SAT_NumImplications(SAT_Manager mng); |
|---|
| 324 | |
|---|
| 325 | int SAT_MaxDLevel(SAT_Manager mng); |
|---|
| 326 | |
|---|
| 327 | float SAT_AverageBubbleMove(SAT_Manager mng); |
|---|
| 328 | // Following function will allow you to traverse all the |
|---|
| 329 | // clauses and literals. Clause is represented by a index. |
|---|
| 330 | // The original clauses' indice are not changed during the |
|---|
| 331 | // whole process, while added clauses may get deleted, so |
|---|
| 332 | // a certain index may not always represent the same |
|---|
| 333 | // clause, also, a index may not always be valid. |
|---|
| 334 | int SAT_GetFirstClause(SAT_Manager mng); |
|---|
| 335 | |
|---|
| 336 | // GetClauseType will get the clause's type. it can be |
|---|
| 337 | // ORIGINAL_CL, CONFLICT_CL, PROBE_CL |
|---|
| 338 | int SAT_GetClauseType(SAT_Manager mng, int cl_idx); |
|---|
| 339 | |
|---|
| 340 | // if there are no more clauses left, return value is -1. |
|---|
| 341 | // the organization is like : |
|---|
| 342 | // index 0 ... InitNumClauses - 1 are the original clauses |
|---|
| 343 | // after that, they are added clauses. |
|---|
| 344 | int SAT_GetNextClause(SAT_Manager mng, int cl_idx); |
|---|
| 345 | |
|---|
| 346 | int SAT_GetClauseNumLits(SAT_Manager mng, int cl_idx); |
|---|
| 347 | |
|---|
| 348 | // the lits array should have been pre-allocated enough memory |
|---|
| 349 | // to store all the lits of a clause. Use SAT_GetClauseNumLits to find |
|---|
| 350 | // out before-hand how much memory is required. |
|---|
| 351 | void SAT_GetClauseLits(SAT_Manager mng, int cl_idx, int * lits); |
|---|
| 352 | |
|---|
| 353 | // Following functions dictate the run time behavior |
|---|
| 354 | // Don't mess with them unless you know what you are doing |
|---|
| 355 | void SAT_EnableConfClsDeletion(SAT_Manager mng); |
|---|
| 356 | void SAT_DisableConfClsDeletion(SAT_Manager mng); |
|---|
| 357 | void SAT_SetClsDeletionInterval(SAT_Manager mng, int freq); |
|---|
| 358 | |
|---|
| 359 | void SAT_SetMaxUnrelevance(SAT_Manager mng, int n); |
|---|
| 360 | void SAT_SetMinClsLenForDelete(SAT_Manager mng, int n); |
|---|
| 361 | void SAT_SetMaxConfClsLenAllowed(SAT_Manager mng, int n); |
|---|
| 362 | |
|---|
| 363 | // void SAT_AllowMultipleConflicts(SAT_Manager mng); |
|---|
| 364 | // void SAT_AllowMultipleConfCls(SAT_Manager mng); |
|---|
| 365 | // void SAT_SetLitPoolCompactRatio(SAT_Manager mng, float ratio); |
|---|
| 366 | // void SAT_SetLitPoolExpantionRatio(SAT_Manager mng, float ration); |
|---|
| 367 | |
|---|
| 368 | // this function cleans all learned clauses in the database. |
|---|
| 369 | // it can be called if you incrementally solving many instances and |
|---|
| 370 | // the learned clauses occupy too much memory. By calling |
|---|
| 371 | // this function, it essentially equal to a fresh restart, i.e. throw |
|---|
| 372 | // away the learned clauses obtained so far. |
|---|
| 373 | void SAT_CleanUpDatabase(SAT_Manager mng); |
|---|
| 374 | |
|---|
| 375 | // Followings are functions to facilitate the translation from |
|---|
| 376 | // Circuit to a CNF representation. It will automatically generate |
|---|
| 377 | // the necessary clauses to represent the gates. |
|---|
| 378 | // Note: The input convension are the same as in AddClause, |
|---|
| 379 | // e.g. 2 * Vid + Sign |
|---|
| 380 | // NOTE: You need to make sure that the signals (a, b, c, o etc) are |
|---|
| 381 | // distinctive. I.e. the two inputs to a AND2 gate are different |
|---|
| 382 | // signals. Otherwise, the solver may behave incorrectly. Don't |
|---|
| 383 | // add a gate that has signal a and a' as inputs. You should do |
|---|
| 384 | // these kinds of special case simplifications by yourself. |
|---|
| 385 | |
|---|
| 386 | |
|---|
| 387 | void SAT_GenClsAnd2(SAT_Manager mng, |
|---|
| 388 | int a, |
|---|
| 389 | int b, |
|---|
| 390 | int o, |
|---|
| 391 | int gid = 0); |
|---|
| 392 | |
|---|
| 393 | void SAT_GenClsAndN(SAT_Manager mng, |
|---|
| 394 | int * inputs, |
|---|
| 395 | int num_inputs, |
|---|
| 396 | int o, |
|---|
| 397 | int gid = 0); |
|---|
| 398 | |
|---|
| 399 | void SAT_GenClsOr2(SAT_Manager mng, |
|---|
| 400 | int a, |
|---|
| 401 | int b, |
|---|
| 402 | int o, |
|---|
| 403 | int gid = 0); |
|---|
| 404 | |
|---|
| 405 | void SAT_GenClsOrN(SAT_Manager mng, |
|---|
| 406 | int * inputs, |
|---|
| 407 | int num_inputs, |
|---|
| 408 | int o, |
|---|
| 409 | int gid = 0); |
|---|
| 410 | |
|---|
| 411 | void SAT_GenClsNand2(SAT_Manager mng, |
|---|
| 412 | int a, |
|---|
| 413 | int b, |
|---|
| 414 | int o, |
|---|
| 415 | int gid = 0); |
|---|
| 416 | |
|---|
| 417 | void SAT_GenClsNandN(SAT_Manager mng, |
|---|
| 418 | int * inputs, |
|---|
| 419 | int num_inputs, |
|---|
| 420 | int o, |
|---|
| 421 | int gid = 0); |
|---|
| 422 | |
|---|
| 423 | void SAT_GenClsNor2(SAT_Manager mng, |
|---|
| 424 | int a, |
|---|
| 425 | int b, |
|---|
| 426 | int o, |
|---|
| 427 | int gid = 0); |
|---|
| 428 | |
|---|
| 429 | void SAT_GenClsNorN(SAT_Manager mng, |
|---|
| 430 | int * inputs, |
|---|
| 431 | int num_inputs, |
|---|
| 432 | int o, |
|---|
| 433 | int gid = 0); |
|---|
| 434 | |
|---|
| 435 | void SAT_GenClsXor(SAT_Manager mng, |
|---|
| 436 | int a, |
|---|
| 437 | int b, |
|---|
| 438 | int o, |
|---|
| 439 | int gid = 0); |
|---|
| 440 | |
|---|
| 441 | void SAT_GenClsNot(SAT_Manager mng, |
|---|
| 442 | int a, |
|---|
| 443 | int o, |
|---|
| 444 | int gid = 0); |
|---|
| 445 | |
|---|
| 446 | #endif |
|---|