summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.hgignore2
-rw-r--r--src/base/main/main.c9
-rw-r--r--src/python/pyabc.i172
-rw-r--r--src/python/setup.py2
4 files changed, 122 insertions, 63 deletions
diff --git a/.hgignore b/.hgignore
index 70cbfca8..b53696d7 100644
--- a/.hgignore
+++ b/.hgignore
@@ -33,7 +33,7 @@ abcext.dsp
src/python/build
src/python/bdist
src/python/pyabc.py
-src.python/pyabc_wrap.*
+src/python/pyabc_wrap.*
syntax: regexp
diff --git a/src/base/main/main.c b/src/base/main/main.c
index 42ea255d..0b6294c4 100644
--- a/src/base/main/main.c
+++ b/src/base/main/main.c
@@ -90,7 +90,14 @@ int Abc_RealMain( int argc, char * argv[] )
init_pyabc();
pModule = PyImport_ImportModule("pyabc");
- Py_DECREF(pModule);
+ if (pModule)
+ {
+ Py_DECREF(pModule);
+ }
+ else
+ {
+ fprintf( pAbc->Err, "error: pyabc.py not found. PYTHONPATH may not be set properly.\n");
+ }
}
#endif /* ABC_PYTHON_EMBED */
diff --git a/src/python/pyabc.i b/src/python/pyabc.i
index 9dabc3db..56ef5cb0 100644
--- a/src/python/pyabc.i
+++ b/src/python/pyabc.i
@@ -25,12 +25,8 @@
#include <main.h>
#include <stdlib.h>
#include <signal.h>
-
-void sigint_signal_handler(int sig)
-{
- _exit(1);
-}
-
+#include <hash.h>
+#include <hashPtr.h>
int n_ands()
{
@@ -85,14 +81,6 @@ int n_latches()
return -1;
}
-int run_command(char* cmd)
-{
- Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- int fStatus = Cmd_CommandExecute(pAbc, cmd);
-
- return fStatus;
-}
-
bool has_comb_model()
{
Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
@@ -180,43 +168,99 @@ void pyabc_internal_set_command_callback( PyObject* callback )
Py_XINCREF(callback);
Py_XDECREF(pyabc_internal_python_command_callback);
- pyabc_internal_python_command_callback = callback;
+ pyabc_internal_python_command_callback = callback;
}
static int pyabc_internal_abc_command_callback(Abc_Frame_t * pAbc, int argc, char ** argv)
{
- int i;
-
- PyObject* args;
- PyObject* arglist;
- PyObject* res;
- long lres;
-
- if ( !pyabc_internal_python_command_callback )
- return 0;
-
- args = PyList_New(argc);
-
- for( i=0 ; i<argc ; i++ )
- PyList_SetItem(args, i, PyString_FromString(argv[i]) );
-
- arglist = Py_BuildValue("(O)", args);
- Py_INCREF(arglist);
-
- res = PyEval_CallObject( pyabc_internal_python_command_callback, arglist );
- Py_DECREF(arglist);
-
- lres = PyInt_AsLong(res);
- Py_DECREF(res);
-
- return lres;
+ int i;
+
+ PyObject* args;
+ PyObject* arglist;
+ PyObject* res;
+
+ long lres;
+
+ if ( !pyabc_internal_python_command_callback )
+ return 0;
+
+ args = PyList_New(argc);
+
+ for( i=0 ; i<argc ; i++ )
+ PyList_SetItem(args, i, PyString_FromString(argv[i]) );
+
+ arglist = Py_BuildValue("(O)", args);
+ Py_INCREF(arglist);
+
+ res = PyEval_CallObject( pyabc_internal_python_command_callback, arglist );
+ Py_DECREF(arglist);
+
+ if ( !res )
+ {
+ return -1;
+ }
+
+ lres = PyInt_AsLong(res);
+ Py_DECREF(res);
+
+ return lres;
+}
+
+int run_command(char* cmd)
+{
+ Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
+ return Cmd_CommandExecute(pAbc, cmd);
}
void pyabc_internal_register_command( char * sGroup, char * sName, int fChanges )
{
Abc_Frame_t* pAbc = Abc_FrameGetGlobalFrame();
- Cmd_CommandAdd( pAbc, sGroup, sName, (void*)pyabc_internal_abc_command_callback, fChanges);
+ Cmd_CommandAdd( pAbc, sGroup, sName, (void*)pyabc_internal_abc_command_callback, fChanges);
+}
+
+static Hash_Ptr_t* active_pid_hash = NULL;
+
+void sigint_handler(int signum)
+{
+ int i;
+ Hash_Ptr_Entry_t* pEntry;
+
+ assert( signum == SIGINT );
+
+ Hash_PtrForEachEntry(active_pid_hash, pEntry, i)
+ {
+ int pid = pEntry->key;
+ kill(pid, SIGINT);
+ }
+
+ _exit(1);
+}
+
+void add_child_pid(int pid)
+{
+ Hash_PtrWriteEntry(active_pid_hash, pid, NULL);
+}
+
+void remove_child_pid(int pid)
+{
+ Hash_PtrRemove(active_pid_hash, pid);
+}
+
+static sigset_t old_procmask;
+
+void block_sigint()
+{
+ sigset_t set;
+ sigemptyset(&set);
+ sigaddset(&set, SIGINT);
+
+ sigprocmask(SIG_BLOCK, &set, &old_procmask);
+}
+
+void restore_sigint_block()
+{
+ sigprocmask(SIG_SETMASK, &old_procmask, NULL);
}
%}
@@ -224,7 +268,8 @@ void pyabc_internal_register_command( char * sGroup, char * sName, int fChanges
%init
%{
Abc_Start();
- signal(SIGINT, sigint_signal_handler);
+ active_pid_hash = Hash_PtrAlloc(1);
+ signal(SIGINT, sigint_handler);
%}
int n_ands();
@@ -252,31 +297,36 @@ int n_phases();
void pyabc_internal_set_command_callback( PyObject* callback );
void pyabc_internal_register_command( char * sGroup, char * sName, int fChanges );
+void block_sigint();
+void restore_sigint_block();
+void add_child_pid(int pid);
+void remove_child_pid(int pid);
+
%pythoncode
%{
_registered_commands = {}
def _cmd_callback(args):
- try:
- assert len(args) > 0
-
- cmd = args[0]
- assert cmd in _registered_commands
-
- res = _registered_commands[cmd](args)
-
- assert type(res) == int, "User-defined Python command must return an integer."
-
- return res
-
- except Exception, e:
- print "Python error: ", e
-
- except SystemExit, se:
- pass
-
- return 0
+ try:
+ assert len(args) > 0
+
+ cmd = args[0]
+ assert cmd in _registered_commands
+
+ res = _registered_commands[cmd](args)
+
+ assert type(res) == int, "User-defined Python command must return an integer."
+
+ return res
+
+ except Exception, e:
+ print "Python error: ", e
+
+ except SystemExit, se:
+ pass
+
+ return 0
pyabc_internal_set_command_callback( _cmd_callback )
diff --git a/src/python/setup.py b/src/python/setup.py
index abc07afa..af2f5547 100644
--- a/src/python/setup.py
+++ b/src/python/setup.py
@@ -6,6 +6,7 @@ from distutils import util
include_dirs = [
'../aig/hop',
+ '../aig/gia',
'../base/abc',
'../base/cmd',
'../base/io',
@@ -18,6 +19,7 @@ include_dirs = [
'../misc/st',
'../misc/util',
'../misc/vec',
+ '../misc/hash',
]
define_macros = []