Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def __init__(self, handle, path, handle_type):
"""
Args:
handle (int): The GPI handle to the simulator object.
path (str): Path to this handle, ``None`` if root.
handle_type: The type of the handle
(``simulator.INTEGER``, ``simulator.ENUM``,
``simulator.REAL``, ``simulator.STRING``).
"""
NonHierarchyObject.__init__(self, handle, path)
if handle_type in [simulator.INTEGER, simulator.ENUM]:
self._value = self._handle.get_signal_val_long()
elif handle_type == simulator.REAL:
self._value = self._handle.get_signal_val_real()
elif handle_type == simulator.STRING:
self._value = self._handle.get_signal_val_str()
else:
val = self._handle.get_signal_val_binstr()
self._value = BinaryValue(n_bits=len(val))
try:
self._value.binstr = val
except Exception:
self._value = val
# Add it back because users expect to be able to import files in their test directory.
# TODO: move this to gpi_embed.cpp
sys.path.insert(0, "")
_setup_logging()
# From https://www.python.org/dev/peps/pep-0565/#recommended-filter-settings-for-test-runners
# If the user doesn't want to see these, they can always change the global
# warning settings in their test module.
if not sys.warnoptions:
warnings.simplefilter("default")
from cocotb import simulator
global SIM_NAME, SIM_VERSION
SIM_NAME = simulator.get_simulator_product().strip()
SIM_VERSION = simulator.get_simulator_version().strip()
cocotb.log.info("Running on {} version {}".format(SIM_NAME, SIM_VERSION))
memcheck_port = os.getenv('MEMCHECK')
if memcheck_port is not None:
mem_debug(int(memcheck_port))
log.info("Running tests with cocotb v%s from %s" %
(__version__, os.path.dirname(__file__)))
# Create the base handle type
process_plusargs()
global scheduler
"""Factory function to create the correct type of `SimHandle` object.
Args:
handle (int): The GPI handle to the simulator object.
path (str): Path to this handle, ``None`` if root.
Returns:
The `SimHandle` object.
Raises:
TestError: If no matching object for GPI type could be found.
"""
_type2cls = {
simulator.MODULE: HierarchyObject,
simulator.STRUCTURE: HierarchyObject,
simulator.REG: ModifiableObject,
simulator.NET: ModifiableObject,
simulator.NETARRAY: NonHierarchyIndexableObject,
simulator.REAL: RealObject,
simulator.INTEGER: IntegerObject,
simulator.ENUM: EnumObject,
simulator.STRING: StringObject,
simulator.GENARRAY: HierarchyArrayObject,
}
# Enforce singletons since it's possible to retrieve handles avoiding
# the hierarchy by getting driver/load information
global _handle2obj
try:
return _handle2obj[handle]
except KeyError:
pass
def get_sim_time(units=None):
"""Retrieves the simulation time from the simulator.
Args:
units (str or None, optional): String specifying the units of the result
(one of ``None``, ``'fs'``, ``'ps'``, ``'ns'``, ``'us'``, ``'ms'``, ``'sec'``).
``None`` will return the raw simulation time.
Returns:
The simulation time in the specified units.
"""
timeh, timel = simulator.get_sim_time()
result = (timeh << 32 | timel)
if units is not None:
result = get_time_from_sim_steps(result, units)
return result
def __init__(self, handle, path, handle_type):
"""
Args:
handle (int): The GPI handle to the simulator object.
path (str): Path to this handle, ``None`` if root.
handle_type: The type of the handle
(``simulator.INTEGER``, ``simulator.ENUM``,
``simulator.REAL``, ``simulator.STRING``).
"""
NonHierarchyObject.__init__(self, handle, path)
if handle_type in [simulator.INTEGER, simulator.ENUM]:
self._value = self._handle.get_signal_val_long()
elif handle_type == simulator.REAL:
self._value = self._handle.get_signal_val_real()
elif handle_type == simulator.STRING:
self._value = self._handle.get_signal_val_str()
else:
val = self._handle.get_signal_val_binstr()
self._value = BinaryValue(n_bits=len(val))
try:
self._value.binstr = val
except Exception:
self._value = val
def SimHandle(handle, path=None):
"""Factory function to create the correct type of `SimHandle` object.
Args:
handle (int): The GPI handle to the simulator object.
path (str): Path to this handle, ``None`` if root.
Returns:
The `SimHandle` object.
Raises:
TestError: If no matching object for GPI type could be found.
"""
_type2cls = {
simulator.MODULE: HierarchyObject,
simulator.STRUCTURE: HierarchyObject,
simulator.REG: ModifiableObject,
simulator.NET: ModifiableObject,
simulator.NETARRAY: NonHierarchyIndexableObject,
simulator.REAL: RealObject,
simulator.INTEGER: IntegerObject,
simulator.ENUM: EnumObject,
simulator.STRING: StringObject,
simulator.GENARRAY: HierarchyArrayObject,
}
# Enforce singletons since it's possible to retrieve handles avoiding
# the hierarchy by getting driver/load information
global _handle2obj
try:
return _handle2obj[handle]
level = os.environ["COCOTB_LOG_LEVEL"].upper()
except KeyError:
level = _COCOTB_LOG_LEVEL_DEFAULT
try:
log.setLevel(level)
except ValueError:
valid_levels = ('CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG')
raise ValueError("Invalid log level %r passed through the "
"COCOTB_LOG_LEVEL environment variable. Valid log "
"levels: %s" % (level, ', '.join(valid_levels)))
# Notify GPI of log level, which it uses as an optimization to avoid
# calling into Python.
from cocotb import simulator
simulator.log_level(log.getEffectiveLevel())
def _discover_all(self):
"""When iterating or performing IPython tab completion, we run through ahead of
time and discover all possible children, populating the :any:`_sub_handles`
mapping. Hierarchy can't change after elaboration so we only have to
do this once.
"""
if self._discovered:
return
self._log.debug("Discovering all on %s", self._name)
for thing in self._handle.iterate(simulator.OBJECTS):
name = thing.get_name_string()
try:
hdl = SimHandle(thing, self._child_path(name))
except TestError as e:
self._log.debug("%s", e)
continue
try:
key = self._sub_handle_key(name)
except ValueError:
self._log.debug("Unable to translate handle >%s< to a valid _sub_handle key", hdl._name)
continue
self._sub_handles[key] = hdl
self._discovered = True
def prime(self, callback):
if self.cbhdl is None:
self.cbhdl = simulator.register_readonly_callback(callback, self)
if self.cbhdl is None:
raise TriggerException("Unable set up %s Trigger" % (str(self)))
GPITrigger.prime(self, callback)