import ctypes import os import sys from os.path import dirname, join, exists, normpath from shutil import which from libghdl.version import __version__ def _to_char_p(arg): return ctypes.c_char_p(arg), len(arg) def _get_libghdl_name(): """Get the name of the libghdl library (with version and extension)""" ver = __version__.replace('-', '_').replace('.', '_') ext = {'win32': 'dll', 'cygwin': 'dll', 'darwin': 'dylib'}.get(sys.platform, 'so') return 'libghdl-' + ver + '.' + ext def _check_libghdl_libdir(libdir, basename): """Return libghdl path in :param libdir" if found or None""" if libdir is None: return None # print('libghdl: check in {}'.format(libdir)) res = join(libdir, basename) if exists(res): return res return None def _check_libghdl_bindir(bindir, basename): if bindir is None: return None return _check_libghdl_libdir(normpath(join(bindir, '..', 'lib')), basename) def _get_libghdl_path(): """Locate the directory where the shared library is""" basename = _get_libghdl_name() # Try GHDL_PREFIX r = os.environ.get('GHDL_PREFIX') if r is not None: # GHDL_PREFIX is the prefix of the vhdl libraries, so remove the # last path component. r = _check_libghdl_libdir(dirname(r), basename) if r is not None: return r # Try VUNIT_GHDL_PATH (path of the ghdl binary when using VUnit). r = _check_libghdl_bindir (os.environ.get('VUNIT_GHDL_PATH'), basename) if r is not None: return r # Try GHDL (name/path of the ghdl binary) r = os.environ.get('GHDL', 'ghdl') r = which(r) if r is not None: r = _check_libghdl_bindir(dirname(r), basename) if r is not None: return r # Try within libghdl/ python installation r = __file__ r = _check_libghdl_bindir(dirname(r), basename) if r is not None: return r # Try when running from the build directory r = normpath(join(dirname(__file__), '..', '..', 'lib')) r = _check_libghdl_libdir(r, basename) if r is not None: return r # Failed. raise Exception('Cannot find libghdl {}'.format(basename)) # Load the shared library _libghdl_path = _get_libghdl_path() libghdl = ctypes.CDLL(_libghdl_path) # Initialize it. libghdl.libghdl_init() libghdl.libghdl__set_hooks_for_analysis() # Set the prefix in order to locate the vhdl libraries. libghdl.libghdl__set_exec_prefix( *_to_char_p(dirname(dirname(_libghdl_path)).encode('utf-8'))) def set_option(opt): "Set option OPT. Return true iff the option is known and handled" return libghdl.libghdl__set_option(*_to_char_p(opt)) == 0 def analyze_init(): return libghdl.libghdl__analyze_init() def analyze_file(fname): return libghdl.libghdl__analyze_file(*_to_char_p(fname)) def disp_config(): return libghdl.ghdllocal__disp_config_prefixes()