summaryrefslogtreecommitdiffstats
path: root/demo.c
diff options
context:
space:
mode:
Diffstat (limited to 'demo.c')
-rw-r--r--demo.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/demo.c b/demo.c
new file mode 100644
index 00000000..2f9d1bff
--- /dev/null
+++ b/demo.c
@@ -0,0 +1,115 @@
+// Demo program for the static library project of ABC
+
+#include <stdio.h>
+#include "src/sat/csat/csat_apis.h"
+
+// procedures to start and stop the ABC framework
+extern void Abc_Start();
+extern void Abc_Stop();
+
+// simple test prog
+int main( int argc, char * argv[] )
+{
+ CSAT_Manager_t * mng;
+ CSAT_Target_ResultT * pResult;
+ char * Names[2];
+ int Values[2];
+ int i;
+
+ // start ABC
+ // (calling Abc_Start() for each problem is timeconsuming
+ // because it allocates some internal data structures used by decomposition packages
+ // so Abc_Start should be called once before creating many solution managers)
+ Abc_Start();
+
+ // start the solution manager
+ // (the manager can be reused for several targets if the targets
+ // use the same network and only differ in the asserted values;
+ // however, only one target can be loaded into the manager at any time)
+ mng = CSAT_InitManager();
+
+ // create a simple circuit
+ // PIs: A, B, C
+ // POs: F = ((AB)C) <+> (A(BC))
+ // Internal nodes:
+ // X = AB U = XC
+ // Y = BC W = AY
+ // G = U <+> W
+ // F = G
+
+ // PIs should be added first
+ CSAT_AddGate( mng, CSAT_BPI, "A", 0, NULL, 0 );
+ CSAT_AddGate( mng, CSAT_BPI, "B", 0, NULL, 0 );
+ CSAT_AddGate( mng, CSAT_BPI, "C", 0, NULL, 0 );
+ // internal nodes should be added next
+ Names[0] = "A";
+ Names[1] = "B";
+ CSAT_AddGate( mng, CSAT_BAND, "X", 2, Names, 0 );
+// CSAT_AddGate( mng, CSAT_BOR, "X", 2, Names, 0 ); // use this line to make the problem SATISFIABLE
+ Names[0] = "X";
+ Names[1] = "C";
+ CSAT_AddGate( mng, CSAT_BAND, "U", 2, Names, 0 );
+ Names[0] = "B";
+ Names[1] = "C";
+ CSAT_AddGate( mng, CSAT_BAND, "Y", 2, Names, 0 );
+ Names[0] = "A";
+ Names[1] = "Y";
+ CSAT_AddGate( mng, CSAT_BAND, "W", 2, Names, 0 );
+ Names[0] = "U";
+ Names[1] = "W";
+ CSAT_AddGate( mng, CSAT_BXOR, "G", 2, Names, 0 );
+ // POs should be added last
+ Names[0] = "G";
+ CSAT_AddGate( mng, CSAT_BPO, "F", 1, Names, 0 );
+
+ // check integrity of the manager (and finalize ABC network in the manager!)
+ if ( CSAT_Check_Integrity( mng ) )
+ printf( "Integrity is okey.\n" );
+ else
+ printf( "Integrity is NOT okey.\n" );
+
+ // dump the problem into a BENCH file
+ // currently BENCH file can only be written for an AIG
+ // so we will transform the network into AIG before dumping it
+ CSAT_EnableDump( mng, "simple.bench" );
+ CSAT_Dump_Bench_File( mng );
+
+ // set the solving target (only one target at a time!)
+ // the target can be expressed sing PI/PO or internal nodes
+ Names[0] = "F";
+ Values[0] = 1;
+ CSAT_AddTarget( mng, 1, Names, Values );
+
+ // initialize the sover
+ CSAT_SolveInit( mng );
+
+ // set the solving option (0 = brute-force SAT; 1 = resource-aware FRAIG)
+ CSAT_SetSolveOption( mng, 1 );
+
+ // solves the last added target
+ CSAT_Solve( mng );
+
+ // get the result of solving
+ pResult = CSAT_Get_Target_Result( mng, 0 );
+
+ // print the report
+ if ( pResult->status == UNDETERMINED )
+ printf( "The problem is UNDETERMINED.\n" );
+ else if ( pResult->status == UNSATISFIABLE )
+ printf( "The problem is UNSATISFIABLE.\n" );
+ else if ( pResult->status == SATISFIABLE )
+ {
+ printf( "The problem is SATISFIABLE.\n" );
+ printf( "Satisfying assignment is: " );
+ for ( i = 0; i < pResult->no_sig; i++ )
+ printf( "%s=%d ", pResult->names[i], pResult->values[i] );
+ printf( "\n" );
+ }
+
+ // free everything to prevent memory leaks
+ CSAT_TargetResFree( pResult );
+ CSAT_QuitManager( mng );
+ Abc_Stop();
+ return 0;
+}
+