class SVRandSocket(RandBase): @inject def __init__(self, top, cons=Inject('sim/svrand/constraints')): basedir = os.path.dirname(__file__) self.tenv = TemplateEnv(basedir) self.tenv.cons = self.tenv.load(basedir, 'svrand_cons.j2').module super().__init__(top, cons) def create_type_cons(self, desc={}): return find_tcon_resolver(desc, self.tenv) def before_setup(self, sim): basedir = os.path.dirname(__file__) tenv = TemplateEnv(basedir) self.create_svrand_top() register_intf(SVServerModule(self.outdir, self.constraints, tenv)) for c in self.constraints: c.index = register_intf(SVServerIntf()) self.conn = reg['sim/svsock/server'] self.send_cmd = self.conn.send_cmd self.dtype_recv = self.conn.dtype_recv def parse_name(self, name): for c in self.constraints: if c.name == name: return c.index, c.dtype def send_req(self, index, dtype): self.send_cmd(CMD_READ | index) return self.dtype_recv(dtype) def get_rand(self, name): index, dtype = self.parse_name(name) data = self.send_req(index, dtype) return data def create_svrand_top(self): base_addr = os.path.dirname(__file__) env = jinja2.Environment(loader=jinja2.FileSystemLoader(base_addr), trim_blocks=True, lstrip_blocks=True) context = { 'tcons': self.constraints, } res = env.get_template('svrand_top.j2').render(context) save_file('svrand_top.sv', self.outdir, res) # custom classes for con in self.constraints: if con.cls == 'qenvelope': context = {'tcon': con} res = env.get_template('qenvelope.j2').render(context) save_file(f'qenvelope_{con.name}.sv', self.outdir, res)
def setup(self): basedir = os.path.dirname(__file__) tenv = TemplateEnv(basedir) tenv.snippets = tenv.load(basedir, 'svsock_intf.j2').module for cp in self.in_cosim_ports: sock_id = register_intf(SVServerIntf(cp.port, tenv)) self.handlers[cp.port.basename] = SimSocketInputDrv(cp.port, sock_id) for p in self.gear.out_ports: sock_id = register_intf(SVServerIntf(p, tenv)) self.handlers[p.basename] = SimSocketOutputDrv(p, sock_id) register_intf(SVServerModule(self.rtl_node, tenv, self.srcdir, rst=self.rst)) self.conn = reg['sim/svsock/server'] self.send_cmd = self.conn.send_cmd super().setup()
def load_jenv(): jenv = TemplateEnv(os.path.dirname(__file__)) jenv.snippets = jenv.load(jenv.basedir, 'snippet.j2').module return jenv