OpenFPGA/vpr7_x2p/libarchfpga/SRC/read_xml_spice_util.c

240 lines
5.3 KiB
C
Raw Normal View History

2018-07-26 12:28:21 -05:00
/***********************************/
/* SPICE Modeling for VPR */
/* Xifan TANG, EPFL/LSI */
/***********************************/
#include <string.h>
#include <assert.h>
/* Include vpr structs*/
#include "util.h"
#include "arch_types.h"
/* SPICE Support Headers */
#include "read_xml_spice_util.h"
/* Subroutines to Initial and Free SPICE Structs */
void my_free(void* ptr) {
if (NULL != ptr) {
free(ptr);
}
return;
}
void InitSpiceMeasParams(t_spice_meas_params* meas_params) {
/* MeasParams*/
meas_params->sim_num_clock_cycle = 2;
meas_params->accuracy_type = SPICE_FRAC;
meas_params->accuracy = 1e4;
meas_params->slew_upper_thres_pct_rise = 0.9;
meas_params->slew_lower_thres_pct_rise = 0.1;
meas_params->slew_upper_thres_pct_fall = 0.1;
meas_params->slew_lower_thres_pct_fall = 0.9;
meas_params->input_thres_pct_rise = 0.5;
meas_params->output_thres_pct_rise = 0.5;
meas_params->input_thres_pct_fall = 0.5;
meas_params->output_thres_pct_fall = 0.5;
return;
}
void FreeSpiceMeasParams() {
2018-07-26 12:28:21 -05:00
return;
}
void InitSpiceStimulateParams(t_spice_stimulate_params* stimulate_params) {
/* Clocks */
stimulate_params->clock_slew_rise_time = 0.05;
stimulate_params->clock_slew_rise_type = SPICE_FRAC;
stimulate_params->clock_slew_fall_time = 0.05;
stimulate_params->clock_slew_fall_type = SPICE_FRAC;
stimulate_params->op_clock_freq = 0.;
stimulate_params->prog_clock_freq = 0.;
stimulate_params->sim_clock_freq_slack = 0.2;
/* inputs */
stimulate_params->input_slew_rise_time = 0.05;
stimulate_params->input_slew_rise_type = SPICE_FRAC;
stimulate_params->input_slew_fall_time = 0.05;
stimulate_params->input_slew_fall_type = SPICE_FRAC;
return;
}
void FreeSpiceStimulateParams() {
2018-07-26 12:28:21 -05:00
return;
}
void InitSpiceVariationParams(t_spice_mc_variation_params* mc_variation_params) {
mc_variation_params->variation_on = FALSE;
mc_variation_params->abs_variation = 0.;
mc_variation_params->num_sigma = 1;
}
void FreeSpiceVariationParams() {
2018-07-26 12:28:21 -05:00
return;
}
void InitSpiceMonteCarloParams(t_spice_mc_params* mc_params) {
/* Initialize the CMOS and RRAM variations */
InitSpiceVariationParams(&(mc_params->cmos_variation));
InitSpiceVariationParams(&(mc_params->rram_variation));
return;
}
void FreeSpiceMonteCarloParams() {
2018-07-26 12:28:21 -05:00
return;
}
void InitSpiceParams(t_spice_params* params) {
/* Default Simulation Temperature */
params->sim_temp = 25;
params->post = FALSE;
params->captab = TRUE;
params->fast = TRUE;
/* measure params */
InitSpiceMeasParams(&(params->meas_params));
/* stimulate params*/
InitSpiceStimulateParams(&(params->stimulate_params));
/* stimulate params*/
InitSpiceMonteCarloParams(&(params->mc_params));
return;
}
void FreeSpiceParams() {
2018-07-26 12:28:21 -05:00
return;
}
void FreeSpiceModelNetlist(t_spice_model_netlist* spice_model_netlist) {
my_free(spice_model_netlist->path);
return;
}
void FreeSpiceModelBuffer() {
2018-07-26 12:28:21 -05:00
return;
}
void FreeSpiceModelPassGateLogic() {
2018-07-26 12:28:21 -05:00
return;
}
void FreeSpiceModelPort(t_spice_model_port* spice_model_port) {
my_free(spice_model_port->prefix);
return;
}
void FreeSpiceModelWireParam() {
2018-07-26 12:28:21 -05:00
return;
}
void FreeSpiceModel(t_spice_model* spice_model) {
int i;
my_free(spice_model->name);
my_free(spice_model->prefix);
my_free(spice_model->model_netlist);
spice_model->include_netlist = NULL;
/* Free the buffers */
FreeSpiceModelBuffer();
FreeSpiceModelBuffer();
2018-07-26 12:28:21 -05:00
my_free(spice_model->input_buffer);
my_free(spice_model->output_buffer);
spice_model->input_buffer = NULL;
spice_model->output_buffer = NULL;
FreeSpiceModelPassGateLogic();
2018-07-26 12:28:21 -05:00
my_free(spice_model->pass_gate_logic);
spice_model->pass_gate_logic = NULL;
/* Free the ports */
for (i = 0; i < spice_model->num_port; i++) {
FreeSpiceModelPort(&(spice_model->ports[i]));
}
my_free(spice_model->ports);
spice_model->ports = NULL;
spice_model->num_port = 0;
/* Free wire parameters */
if (NULL != spice_model->wire_param) {
FreeSpiceModelWireParam();
2018-07-26 12:28:21 -05:00
my_free(spice_model->wire_param);
spice_model->wire_param = NULL;
}
return;
}
void InitSpice(t_spice* spice) {
spice->num_include_netlist = 0;
spice->include_netlists = NULL;
spice->num_spice_model = 0;
spice->spice_models = NULL;
return;
}
void FreeSpice(t_spice* spice) {
int i;
/* Free SPICE included netlists */
for (i = 0; i < spice->num_include_netlist; i++) {
FreeSpiceModelNetlist(&(spice->include_netlists[i]));
}
my_free(spice->include_netlists);
spice->include_netlists = NULL;
spice->num_include_netlist = 0;
/* Free SPICE Models */
for (i = 0; i < spice->num_spice_model; i++) {
FreeSpiceModel(&(spice->spice_models[i]));
}
my_free(spice->spice_models);
spice->spice_models = NULL;
spice->num_spice_model = 0;
return;
}
void FreeSpiceMuxArch(t_spice_mux_arch* spice_mux_arch) {
my_free(spice_mux_arch->num_input_per_level);
my_free(spice_mux_arch->input_level);
my_free(spice_mux_arch->input_offset);
return;
}
static
2018-07-26 12:28:21 -05:00
void FreeSramInfOrgz(t_sram_inf_orgz* sram_inf_orgz) {
my_free(sram_inf_orgz->spice_model_name);
return;
}
void FreeSramInf(t_sram_inf* sram_inf) {
if (NULL != sram_inf->spice_sram_inf_orgz) {
FreeSramInfOrgz(sram_inf->spice_sram_inf_orgz);
}
if (NULL != sram_inf->verilog_sram_inf_orgz) {
FreeSramInfOrgz(sram_inf->verilog_sram_inf_orgz);
}
return;
}