Source code for caf_verilog.cpx_multiply
from .quantizer import quantize
from .io_helper import write_quantized_output
from numpy import floor
import os
from jinja2 import Environment, FileSystemLoader
from shutil import copy
from .caf_verilog_base import CafVerilogBase
[docs]class CpxMultiply(CafVerilogBase):
def __init__(self, x, y, x_i_bits=12, x_q_bits=0, y_i_bits=12, y_q_bits=0, output_dir='.'):
"""
:param x:
:param y:
:param x_i_bits: Bit length for real values
:param x_q_bits: Bit length for imaginary values
:param y_i_bits: Bit length for real values
:param y_q_bits: Bit length for imaginary values
:param output_dir: Directory to place modules and test files
"""
self.x = x
self.y = y
self.cpx_input_length_check()
self.x_i_bits = x_i_bits
self.x_q_bits = x_q_bits if x_q_bits else self.x_i_bits
self.y_i_bits = y_i_bits
self.y_q_bits = y_q_bits if y_q_bits else self.y_i_bits
self.x_quant = quantize(self.x, self.x_i_bits, self.x_q_bits)
self.y_quant = quantize(self.y, self.y_i_bits, self.y_q_bits)
self.output_dir = output_dir
self.tb_filename = 'cpx_multiply_tb.v'
self.test_value_filename = 'cpx_multiply_input_values.txt'
self.test_output_filename = 'cpx_multiply_output_values.txt'
copy(self.module_path(), self.output_dir)
[docs] def gen_tb(self):
"""
Generate a test bench using quantized values.
:return:
"""
write_quantized_output(self.output_dir, self.test_value_filename, self.x_quant, self.y_quant)
self.write_cpx_multiply_tb_module()
[docs] def gen_quantized_output(self):
"""
Perform the multiplication and then quantize to the closest representation of what the verilog module should
produce for the given bit length.
:return:
"""
"""
x y
(x + yi)(u + vi) = (xu - yv) + (xv + yu)i
"""
xu = floor(self.x_quant.real) * floor(self.y_quant.real)
yv = floor(self.x_quant.imag) * floor(self.y_quant.imag)
xv = floor(self.x_quant.real) * floor(self.y_quant.imag)
yu = floor(self.x_quant.imag) * floor(self.y_quant.real)
i_sub = xu - yv
y_add = xv + yu
final_out = i_sub + y_add*1j
return final_out
[docs] def write_cpx_multiply_tb_module(self):
"""
Write out a testbench file to test the cpx_multiply module.
:return:
"""
out_tb = None
t_dict = self.template_dict("cpx_multiply_tb")
template_loader = FileSystemLoader(searchpath=self.tb_module_path())
env = Environment(loader=template_loader)
template = env.get_template('cpx_multiply_tb.v')
out_tb = template.render(**t_dict)
with open(os.path.join(self.output_dir, self.tb_filename), 'w+') as tb_file:
tb_file.write(out_tb)
[docs] def template_dict(self, inst_name=None):
t_dict = {'xi_bits': self.x_i_bits, 'xq_bits': self.x_q_bits, 'yi_bits': self.y_i_bits,
'yq_bits': self.y_q_bits}
t_dict['i_out_bits'] = self.x_i_bits + self.y_i_bits
t_dict['q_out_bits'] = self.x_q_bits + self.y_q_bits
t_dict['cpx_multiply_input'] = os.path.abspath(os.path.join(self.output_dir, self.test_value_filename))
t_dict['cpx_multiply_output'] = os.path.abspath(os.path.join(self.output_dir, self.test_output_filename))
t_dict['cpx_multiply_name'] = inst_name if inst_name else 'cpx_multiply_tb'
return t_dict