packages feed

clash-vexriscv-0.1: data/vexriscv/ffi/vimpl.cpp

// SPDX-FileCopyrightText: 2022 Google LLC
//
// SPDX-License-Identifier: Apache-2.0
#include "V__CPU_NAME__VexRiscv.h"
#include "interface.h"
#include "verilated.h"
#include <string.h>
#include <verilated_vcd_c.h>

// Unique function names for: V__CPU_NAME__VexRiscv
extern "C" {
V__CPU_NAME__VexRiscv *V__CPU_NAME__VexRiscv_init();
VerilatedVcdC *V__CPU_NAME__VexRiscv_init_vcd(V__CPU_NAME__VexRiscv *top,
                                              const char *path);
void V__CPU_NAME__VexRiscv_shutdown(V__CPU_NAME__VexRiscv *top);

void V__CPU_NAME__VexRiscv_init_stage1(VerilatedVcdC *vcd,
                                       uint64_t dom_period_fs,
                                       V__CPU_NAME__VexRiscv *top,
                                       const NON_COMB_INPUT *input,
                                       OUTPUT *output);
void V__CPU_NAME__VexRiscv_init_stage2(V__CPU_NAME__VexRiscv *top,
                                       const COMB_INPUT *input);
void V__CPU_NAME__VexRiscv_step_rising_edge(VerilatedVcdC *vcd,
                                            V__CPU_NAME__VexRiscv *top,
                                            uint64_t time_add,
                                            const NON_COMB_INPUT *input,
                                            OUTPUT *output);
void V__CPU_NAME__VexRiscv_step_falling_edge(VerilatedVcdC *vcd,
                                             V__CPU_NAME__VexRiscv *top,
                                             uint64_t time_add,
                                             const COMB_INPUT *input);
}

V__CPU_NAME__VexRiscv *V__CPU_NAME__VexRiscv_init() {
  VerilatedContext *ctx = new VerilatedContext;
  V__CPU_NAME__VexRiscv *v = new V__CPU_NAME__VexRiscv(ctx);
  v->clk = false;
  return v;
}

VerilatedVcdC *V__CPU_NAME__VexRiscv_init_vcd(V__CPU_NAME__VexRiscv *top,
                                              const char *path) {
  VerilatedVcdC *vcd = new VerilatedVcdC;
  Verilated::traceEverOn(true);
  top->trace(vcd, 99);
  vcd->open(path);
  return vcd;
}

static void set_non_comb_inputs(V__CPU_NAME__VexRiscv *top,
                                const NON_COMB_INPUT *input) {
  top->reset = input->reset;
  top->timerInterrupt = input->timerInterrupt;
  top->externalInterrupt = input->externalInterrupt;
  top->softwareInterrupt = input->softwareInterrupt;
}

static void set_comb_inputs(V__CPU_NAME__VexRiscv *top,
                            const COMB_INPUT *input) {
  top->iBusWishbone_ACK = input->iBusWishbone_ACK;
  top->iBusWishbone_DAT_MISO = input->iBusWishbone_DAT_MISO;
  top->iBusWishbone_ERR = input->iBusWishbone_ERR;
  top->dBusWishbone_ACK = input->dBusWishbone_ACK;
  top->dBusWishbone_DAT_MISO = input->dBusWishbone_DAT_MISO;
  top->dBusWishbone_ERR = input->dBusWishbone_ERR;
  top->jtag_tck = input->jtag_TCK;
  top->jtag_tms = input->jtag_TMS;
  top->jtag_tdi = input->jtag_TDI;
}

static void set_outputs(V__CPU_NAME__VexRiscv *top, OUTPUT *output) {
  output->iBusWishbone_CYC = top->iBusWishbone_CYC;
  output->iBusWishbone_STB = top->iBusWishbone_STB;
  output->iBusWishbone_WE = top->iBusWishbone_WE;
  output->iBusWishbone_ADR = top->iBusWishbone_ADR;
  output->iBusWishbone_DAT_MOSI = top->iBusWishbone_DAT_MOSI;
  output->iBusWishbone_SEL = top->iBusWishbone_SEL;
  output->iBusWishbone_CTI = top->iBusWishbone_CTI;
  output->iBusWishbone_BTE = top->iBusWishbone_BTE;
  output->dBusWishbone_CYC = top->dBusWishbone_CYC;
  output->dBusWishbone_STB = top->dBusWishbone_STB;
  output->dBusWishbone_WE = top->dBusWishbone_WE;
  output->dBusWishbone_ADR = top->dBusWishbone_ADR;
  output->dBusWishbone_DAT_MOSI = top->dBusWishbone_DAT_MOSI;
  output->dBusWishbone_SEL = top->dBusWishbone_SEL;
  output->dBusWishbone_CTI = top->dBusWishbone_CTI;
  output->dBusWishbone_BTE = top->dBusWishbone_BTE;
  output->ndmreset = top->ndmreset;
  output->stoptime = top->stoptime;
  output->jtag_TDO = top->jtag_tdo;
}

void V__CPU_NAME__VexRiscv_init_stage1(VerilatedVcdC *vcd,
                                       uint64_t dom_period_fs,
                                       V__CPU_NAME__VexRiscv *top,
                                       const NON_COMB_INPUT *input,
                                       OUTPUT *output) {
  VerilatedContext *ctx = top->contextp();
  set_non_comb_inputs(top, input);
  top->eval();
  if (vcd != NULL) {
    vcd->dump(ctx->time());
  }
  set_outputs(top, output);
  ctx->timeInc(dom_period_fs);
}

void V__CPU_NAME__VexRiscv_init_stage2(V__CPU_NAME__VexRiscv *top,
                                       const COMB_INPUT *input) {
  set_comb_inputs(top, input);
}

void V__CPU_NAME__VexRiscv_step_rising_edge(VerilatedVcdC *vcd,
                                            V__CPU_NAME__VexRiscv *top,
                                            uint64_t time_add,
                                            const NON_COMB_INPUT *input,
                                            OUTPUT *output) {
  VerilatedContext *ctx = top->contextp();
  set_non_comb_inputs(top, input);
  top->clk = true;
  top->eval();
  if (vcd != NULL) {
    vcd->dump(ctx->time());
  }
  set_outputs(top, output);
  ctx->timeInc(time_add);
}

void V__CPU_NAME__VexRiscv_step_falling_edge(VerilatedVcdC *vcd,
                                             V__CPU_NAME__VexRiscv *top,
                                             uint64_t time_add,
                                             const COMB_INPUT *input) {
  VerilatedContext *ctx = top->contextp();
  set_comb_inputs(top, input);
  top->clk = false;
  top->eval();
  if (vcd != NULL) {
    vcd->dump(ctx->time());
  }
  ctx->timeInc(time_add);
}

void V__CPU_NAME__VexRiscv_shutdown(V__CPU_NAME__VexRiscv *top) {
  VerilatedContext *ctx = top->contextp();
  delete top;
  delete ctx;
}