/*
 * fwrisc_tracer_bfm.cpp
 *
 *  Created on: Dec 3, 2018
 *      Author: ballance
 */

#include "fwrisc_tracer_bfm.h"
#include "BfmType.h"
#include <stdio.h>

fwrisc_tracer_bfm::fwrisc_tracer_bfm() {
	// TODO Auto-generated constructor stub

}

fwrisc_tracer_bfm::~fwrisc_tracer_bfm() {
	// TODO Auto-generated destructor stub
}

void fwrisc_tracer_bfm::dumpregs() {

}

extern "C" uint32_t fwrisc_tracer_bfm_register(const char *path) {
	uint32_t ret = fwrisc_tracer_bfm_t::register_bfm(path);

	return ret;
}

extern "C" int fwrisc_tracer_bfm_regwrite(
		uint32_t			id,
		uint32_t			raddr,
		uint32_t			rdata) {
	if (fwrisc_tracer_bfm_t::bfm(id)->get_rsp_if()) {
		fwrisc_tracer_bfm_t::bfm(id)->get_rsp_if()->regwrite(raddr, rdata);
	}
	return 0;
}

extern "C" int fwrisc_tracer_bfm_exec(
		uint32_t			id,
		uint32_t			addr,
		uint32_t			instr) {
	if (fwrisc_tracer_bfm_t::bfm(id)->get_rsp_if()) {
		fwrisc_tracer_bfm_t::bfm(id)->get_rsp_if()->exec(addr, instr);
	}
	return 0;
}

extern "C" int fwrisc_tracer_bfm_memwrite(
		uint32_t			id,
		uint32_t			addr,
		uint8_t				mask,
		uint32_t			data) {
	if (fwrisc_tracer_bfm_t::bfm(id)->get_rsp_if()) {
		fwrisc_tracer_bfm_t::bfm(id)->get_rsp_if()->memwrite(addr, mask, data);
	}
	return 0;
}

// Type-based BFM registry
static fwrisc_tracer_bfm_t				bfm_registry;

