Source code for caf_verilog.sim_helper
from logging import getLogger
import numpy as np
try:
from cocotb.runner import get_runner, Simulator
except ImportError as ie:
import warnings
Simulator = object
warnings.warn("Could not import cocotb", ImportWarning)
import os
__hdl_toplevel_lang__ = os.getenv("HDL_TOPLEVEL_LANG", "verilog")
__sim__ = os.getenv("SIM", "verilator")
[docs]
def sim_get_runner() -> Simulator:
return get_runner(__sim__)
[docs]
def get_sim_cpus() -> int:
num_cpus = len(os.sched_getaffinity(0))
num_cpus = max(int(num_cpus / 2), 1)
return num_cpus
[docs]
def sim_shift(ref, ref_center, ref_length, shift=0, rec=None, padding=False,
freq_shift=0, fs=625e3):
"""
:param ref: Reference signal.
:param ref_center: Where to center the simulated signal set.
:param ref_length: The length of the signal equidistant around center.
:param shift: How much shift should be added to the simulated received signal.
:param rec: A received signal can be provided for the correlation simulation.
:param padding: Use padding to add zeros on the reference signal; ex. for generating a plot.
:param freq_shift: Apply a frequency shift to the reference signal, and return with shift as reference.
:param fs: Sampling Frequency
:return: ref, rec
:rtype: tuple
"""
sim_center = ref_center + shift
fill_length = int(ref_length / 2)
index_error = not ((ref_center - ref_length) > 0)
index_error |= not ((ref_center + ref_length) < len(ref))
if index_error:
raise IndexError("Center and length result in an out of bounds error in ref")
if rec:
index_error |= not ((ref_center + ref_length) < len(rec))
if index_error:
raise IndexError("Center and length result in an out of bounds error in rec")
t = np.arange(len(ref))
x_shift = np.exp(2 * np.pi * (freq_shift / fs) * t * 1j)
ref_plus_shift = [ref[i] * x_i_shift for i, x_i_shift in enumerate(x_shift)]
ref_ret = ref[ref_center - fill_length: ref_center + fill_length]
if padding:
fill_zeros = [0 for zz in range(0, fill_length)]
ref_ret = fill_zeros + list(ref_ret)
ref_ret += fill_zeros
if rec:
rec_ret = rec[sim_center - ref_length:sim_center + ref_length]
else:
rec_ret = ref_plus_shift[sim_center - ref_length: sim_center + ref_length]
return ref_ret, rec_ret