remove dead codes for essential gates code generation

This commit is contained in:
tangxifan 2019-08-22 10:01:52 -06:00
parent 43de2d7636
commit 3f45e6cc87
1 changed files with 0 additions and 543 deletions

View File

@ -132,544 +132,6 @@ void dump_verilog_submodule_signal_init(FILE* fp,
return; return;
} }
/* Dump a module of inverter or buffer or tapered buffer */
static
void dump_verilog_invbuf_module(FILE* fp,
t_spice_model* invbuf_spice_model) {
int ipin, iport, port_cnt;
int num_input_port = 0;
int num_output_port = 0;
int num_powergate_port = 0;
t_spice_model_port** input_port = NULL;
t_spice_model_port** output_port = NULL;
t_spice_model_port** powergate_port = NULL;
/* Ensure a valid file handler*/
if (NULL == fp) {
vpr_printf(TIO_MESSAGE_ERROR,"(FILE:%s,LINE[%d])Invalid File handler.\n",
__FILE__, __LINE__);
exit(1);
}
fprintf(fp, "//----- Verilog module for %s -----\n",
invbuf_spice_model->name);
/* Find the input port, output port*/
input_port = find_spice_model_ports(invbuf_spice_model, SPICE_MODEL_PORT_INPUT, &num_input_port, TRUE);
output_port = find_spice_model_ports(invbuf_spice_model, SPICE_MODEL_PORT_OUTPUT, &num_output_port, TRUE);
powergate_port = find_spice_model_config_done_ports(invbuf_spice_model, SPICE_MODEL_PORT_INPUT, &num_powergate_port, FALSE);
/* Make sure:
* There is only 1 input port and 1 output port,
* each size of which is 1
*/
assert(1 == num_input_port);
assert(1 == input_port[0]->size);
assert(1 == num_output_port);
assert(1 == output_port[0]->size);
/* If power-gated, we need to find enable signals */
if (TRUE == invbuf_spice_model->design_tech_info.power_gated) {
if (0 == num_powergate_port) {
vpr_printf(TIO_MESSAGE_ERROR,"(FILE:%s,LINE[%d])Inverter, buffer SPICE model is power-gated, but cannot find any power-gate port!\n",
__FILE__, __LINE__);
exit(1);
}
assert ( 0 < num_powergate_port);
}
/* dump module body */
fprintf(fp, "module %s (\n",
invbuf_spice_model->name);
/* Dump global ports */
if (0 < rec_dump_verilog_spice_model_lib_global_ports(fp, invbuf_spice_model, TRUE, FALSE, FALSE)) {
fprintf(fp, ",\n");
}
/* Dump ports */
fprintf(fp, "input [0:0] %s,\n", input_port[0]->lib_name);
fprintf(fp, "output [0:0] %s\n", output_port[0]->lib_name);
fprintf(fp, ");\n");
/* Finish dumping ports */
/* Assign logics : depending on topology */
switch (invbuf_spice_model->design_tech_info.buffer_info->type) {
case SPICE_MODEL_BUF_INV:
if (TRUE == invbuf_spice_model->design_tech_info.power_gated) {
/* Create a sensitive list */
fprintf(fp, "reg %s_reg;\n", output_port[0]->lib_name);
fprintf(fp, "always @(");
/* Power-gate port first*/
for (iport = 0; iport < num_powergate_port; iport++) {
fprintf(fp, "%s,", powergate_port[iport]->lib_name);
}
fprintf(fp, "%s) begin\n",
input_port[0]->lib_name);
/* Dump the case of power-gated */
fprintf(fp, " if (");
port_cnt = 0; /* Initialize the counter: decide if we need to put down '&&' */
for (iport = 0; iport < num_powergate_port; iport++) {
if (0 == powergate_port[iport]->default_val) {
for (ipin = 0; ipin < powergate_port[iport]->size; ipin++) {
if ( 0 < port_cnt ) {
fprintf(fp, "\n\t&&");
}
/* Power-gated signal are disable during operating, enabled during configuration,
* Therefore, we need to reverse them here
*/
fprintf(fp, "(~%s[%d])",
powergate_port[iport]->lib_name,
ipin);
port_cnt++; /* Update port counter*/
}
} else {
assert (1 == powergate_port[iport]->default_val);
for (ipin = 0; ipin < powergate_port[iport]->size; ipin++) {
if ( 0 < port_cnt ) {
fprintf(fp, "\n\t&&");
}
/* Power-gated signal are disable during operating, enabled during configuration,
* Therefore, we need to reverse them here
*/
fprintf(fp, "(%s[%d])",
powergate_port[iport]->lib_name,
ipin);
port_cnt++; /* Update port counter*/
}
}
}
fprintf(fp, ") begin\n");
fprintf(fp, "\t\tassign %s_reg = ~%s;\n",
output_port[0]->lib_name,
input_port[0]->lib_name);
fprintf(fp, "\tend else begin\n");
fprintf(fp, "\t\tassign %s_reg = 1'bz;\n",
output_port[0]->lib_name);
fprintf(fp, "\tend\n");
fprintf(fp, "end\n");
fprintf(fp, "assign %s = %s_reg;\n",
output_port[0]->lib_name,
output_port[0]->lib_name);
} else {
fprintf(fp, "assign %s = (%s === 1'bz)? $random : ~%s;\n",
output_port[0]->lib_name,
input_port[0]->lib_name,
input_port[0]->lib_name);
}
break;
case SPICE_MODEL_BUF_BUF:
if (TRUE == invbuf_spice_model->design_tech_info.power_gated) {
/* Create a sensitive list */
fprintf(fp, "reg %s_reg;\n", output_port[0]->lib_name);
fprintf(fp, "always @(");
/* Power-gate port first*/
for (iport = 0; iport < num_powergate_port; iport++) {
fprintf(fp, "%s,", powergate_port[iport]->lib_name);
}
fprintf(fp, "%s) begin\n",
input_port[0]->lib_name);
/* Dump the case of power-gated */
fprintf(fp, " if (");
port_cnt = 0; /* Initialize the counter: decide if we need to put down '&&' */
for (iport = 0; iport < num_powergate_port; iport++) {
if (0 == powergate_port[iport]->default_val) {
for (ipin = 0; ipin < powergate_port[iport]->size; ipin++) {
if ( 0 < port_cnt ) {
fprintf(fp, "\n\t&&");
}
/* Power-gated signal are disable during operating, enabled during configuration,
* Therefore, we need to reverse them here
*/
fprintf(fp, "(~%s[%d])",
powergate_port[iport]->lib_name,
ipin);
port_cnt++; /* Update port counter*/
}
} else {
assert (1 == powergate_port[iport]->default_val);
for (ipin = 0; ipin < powergate_port[iport]->size; ipin++) {
if ( 0 < port_cnt ) {
fprintf(fp, "\n\t&&");
}
/* Power-gated signal are disable during operating, enabled during configuration,
* Therefore, we need to reverse them here
*/
fprintf(fp, "(%s[%d])",
powergate_port[iport]->lib_name,
ipin);
port_cnt++; /* Update port counter*/
}
}
}
fprintf(fp, ") begin\n");
fprintf(fp, "\t\tassign %s_reg = %s;\n",
output_port[0]->lib_name,
input_port[0]->lib_name);
fprintf(fp, "\tend else begin\n");
fprintf(fp, "\t\tassign %s_reg = 1'bz;\n",
output_port[0]->lib_name);
fprintf(fp, "\tend\n");
fprintf(fp, "end\n");
fprintf(fp, "assign %s = %s_reg;\n",
output_port[0]->lib_name,
output_port[0]->lib_name);
} else if (FALSE == invbuf_spice_model->design_tech_info.buffer_info->tapered_buf) {
fprintf(fp, "assign %s = (%s === 1'bz)? $random : %s;\n",
output_port[0]->lib_name,
input_port[0]->lib_name,
input_port[0]->lib_name);
} else {
assert (TRUE == invbuf_spice_model->design_tech_info.buffer_info->tapered_buf);
fprintf(fp, "assign %s = (%s === 1'bz)? $random : ",
output_port[0]->lib_name,
input_port[0]->lib_name);
/* depend on the stage, we may invert the output */
if (1 == invbuf_spice_model->design_tech_info.buffer_info->tap_buf_level % 2) {
fprintf(fp, "~");
}
fprintf(fp, "%s;\n",
input_port[0]->lib_name);
}
break;
default:
vpr_printf(TIO_MESSAGE_ERROR,"(File:%s,[LINE%d])Invalid topology for spice model (%s)!\n",
__FILE__, __LINE__, invbuf_spice_model->name);
exit(1);
}
/* Print timing info */
dump_verilog_submodule_timing(fp, invbuf_spice_model);
dump_verilog_submodule_signal_init(fp, invbuf_spice_model);
fprintf(fp, "endmodule\n");
fprintf(fp, "\n");
/* Free */
my_free(input_port);
my_free(output_port);
return;
}
/* Dump a module of pass-gate logic */
static
void dump_verilog_passgate_module(FILE* fp,
t_spice_model* passgate_spice_model) {
int iport;
int num_input_port = 0;
int num_output_port = 0;
t_spice_model_port** input_port = NULL;
t_spice_model_port** output_port = NULL;
/* Ensure a valid file handler*/
if (NULL == fp) {
vpr_printf(TIO_MESSAGE_ERROR,"(FILE:%s,LINE[%d])Invalid File handler.\n",
__FILE__, __LINE__);
exit(1);
}
/* Find the input port, output port*/
input_port = find_spice_model_ports(passgate_spice_model, SPICE_MODEL_PORT_INPUT, &num_input_port, TRUE);
output_port = find_spice_model_ports(passgate_spice_model, SPICE_MODEL_PORT_OUTPUT, &num_output_port, TRUE);
/* Make sure:
* There is only 1 output port,
* each size of which is 1
*/
assert(1 == num_output_port);
assert(1 == output_port[0]->size);
fprintf(fp, "//----- Verilog module for %s -----\n",
passgate_spice_model->name);
/* dump module body */
fprintf(fp, "module %s (\n",
passgate_spice_model->name);
/* Dump global ports */
if (0 < rec_dump_verilog_spice_model_lib_global_ports(fp, passgate_spice_model, TRUE, FALSE, FALSE)) {
fprintf(fp, ",\n");
}
/* Assign ports : depending on topology */
switch (passgate_spice_model->design_tech_info.pass_gate_info->type) {
case SPICE_MODEL_PASS_GATE_TRANSMISSION:
/* Make sure:
* There is only 3 input port (in, sel, selb),
* each size of which is 1
*/
assert(3 == num_input_port);
for (iport = 0; iport < num_input_port; iport++) {
assert(1 == input_port[iport]->size);
}
/* Dump ports */
fprintf(fp, "input [0:0] %s,\n", input_port[0]->lib_name);
fprintf(fp, "input [0:0] %s,\n", input_port[1]->lib_name);
fprintf(fp, "input [0:0] %s,\n", input_port[2]->lib_name);
fprintf(fp, "output [0:0] %s\n", output_port[0]->lib_name);
fprintf(fp, ");\n");
/* Finish dumping ports */
break;
case SPICE_MODEL_PASS_GATE_TRANSISTOR:
/* Make sure:
* There is only 2 input port (in, sel),
* each size of which is 1
*/
assert(2 == num_input_port);
for (iport = 0; iport < num_input_port; iport++) {
assert(1 == input_port[iport]->size);
}
/* Dump ports */
fprintf(fp, "input [0:0] %s,\n", input_port[0]->lib_name);
fprintf(fp, "input [0:0] %s,\n", input_port[1]->lib_name);
fprintf(fp, "output [0:0] %s\n", output_port[0]->lib_name);
fprintf(fp, ");\n");
/* Finish dumping ports */
break;
default:
vpr_printf(TIO_MESSAGE_ERROR,"(File:%s,[LINE%d])Invalid topology for spice model (%s)!\n",
__FILE__, __LINE__, passgate_spice_model->name);
exit(1);
}
/* Dump logics */
fprintf(fp, "assign %s = %s? %s : 1'bz;\n",
output_port[0]->lib_name,
input_port[1]->lib_name,
input_port[0]->lib_name);
/* Print timing info */
dump_verilog_submodule_timing(fp, passgate_spice_model);
/* Print signal initialization */
dump_verilog_submodule_signal_init(fp, passgate_spice_model);
fprintf(fp, "endmodule\n");
fprintf(fp, "\n");
/* Free */
my_free(input_port);
my_free(output_port);
return;
}
/* Dump a module of pass-gate logic */
static
void dump_verilog_gate_module(FILE* fp,
t_spice_model* gate_spice_model) {
int iport, ipin, jport, jpin;
int num_input_port = 0;
int num_output_port = 0;
t_spice_model_port** input_port = NULL;
t_spice_model_port** output_port = NULL;
/* Ensure a valid file handler*/
if (NULL == fp) {
vpr_printf(TIO_MESSAGE_ERROR,"(FILE:%s,LINE[%d])Invalid File handler.\n",
__FILE__, __LINE__);
exit(1);
}
/* Find the input port, output port*/
input_port = find_spice_model_ports(gate_spice_model, SPICE_MODEL_PORT_INPUT, &num_input_port, TRUE);
output_port = find_spice_model_ports(gate_spice_model, SPICE_MODEL_PORT_OUTPUT, &num_output_port, TRUE);
/* Make sure:
* There is only 1 output port,
* each size of which is 1
*/
assert(1 == num_output_port);
assert(1 == output_port[0]->size);
assert(0 < num_input_port);
fprintf(fp, "//----- Verilog module for %s -----\n",
gate_spice_model->name);
/* dump module body */
fprintf(fp, "module %s (\n",
gate_spice_model->name);
/* Dump global ports */
if (0 < rec_dump_verilog_spice_model_lib_global_ports(fp, gate_spice_model, TRUE, FALSE, FALSE)) {
fprintf(fp, ",\n");
}
/* Dump ports */
for (iport = 0; iport < num_input_port; iport++) {
fprintf(fp, "input [0:%d] %s,\n",
input_port[iport]->size - 1, input_port[iport]->lib_name);
}
for (iport = 0; iport < num_output_port; iport++) {
fprintf(fp, "output [0:%d] %s\n",
output_port[iport]->size - 1, output_port[iport]->lib_name);
}
fprintf(fp, ");\n");
/* Dump logics */
switch (gate_spice_model->design_tech_info.gate_info->type) {
case SPICE_MODEL_GATE_AND:
for (iport = 0; iport < num_output_port; iport++) {
for (ipin = 0; ipin < output_port[iport]->size; ipin++) {
fprintf(fp, "assign %s[%d] = ",
output_port[iport]->lib_name, ipin);
for (jport = 0; jport < num_input_port; jport++) {
for (jpin = 0; jpin < input_port[jport]->size; jpin++) {
fprintf(fp, "%s[%d]",
input_port[jport]->lib_name, jpin);
if ((jport == num_input_port - 1) && (jpin == input_port[jport]->size - 1)) {
continue; /* Stop output AND sign for the last element in the loop */
}
fprintf(fp, " & ");
}
}
fprintf(fp, ";\n");
}
}
break;
case SPICE_MODEL_GATE_OR:
for (iport = 0; iport < num_output_port; iport++) {
for (ipin = 0; ipin < output_port[iport]->size; ipin++) {
fprintf(fp, "assign %s[%d] = ",
output_port[iport]->lib_name, ipin);
for (jport = 0; jport < num_input_port; jport++) {
for (jpin = 0; jpin < input_port[jport]->size; jpin++) {
fprintf(fp, "%s[%d]",
input_port[jport]->lib_name, jpin);
if ((jport == num_input_port - 1) && (jpin == input_port[jport]->size - 1)) {
continue; /* Stop output AND sign for the last element in the loop */
}
fprintf(fp, " | ");
}
}
fprintf(fp, ";\n");
}
}
break;
case SPICE_MODEL_GATE_MUX2:
/* Check on the port sequence and map */
/* MUX2 should only have 1 output port with size 1 */
if (1 != num_output_port) {
vpr_printf(TIO_MESSAGE_ERROR,
"(File:%s, [LINE%d]) MUX2 circuit model must have only 1 output!\n",
__FILE__, __LINE__);
exit(1);
} else if (1 != output_port[0]->size) {
vpr_printf(TIO_MESSAGE_ERROR,
"(File:%s, [LINE%d]) Output size of a MUX2 circuit model must be 1!\n",
__FILE__, __LINE__);
exit(1);
}
/* MUX2 should only have 3 output port, each of which has a port size of 1 */
if (3 != num_input_port) {
vpr_printf(TIO_MESSAGE_ERROR,
"(File:%s, [LINE%d]) MUX2 circuit model must have only 3 input!\n",
__FILE__, __LINE__);
exit(1);
} else {
for (iport = 0; iport < num_input_port; iport++) {
/* Bypass port size of 1 */
if (1 == input_port[iport]->size) {
continue;
}
vpr_printf(TIO_MESSAGE_ERROR,
"(File:%s, [LINE%d]) Input size MUX2 circuit model must be 1!\n",
__FILE__, __LINE__);
exit(1);
}
}
/* Now, we output the logic of MUX2
* IMPORTANT Restriction:
* We always assum the first two inputs are data inputs
* the third input is the select port
*/
fprintf(fp, "assign %s[%d] = %s[%d] ? %s[%d] : %s[%d];\n",
output_port[0]->lib_name, 0,
input_port[2]->lib_name, 0,
input_port[0]->lib_name, 0,
input_port[1]->lib_name, 0);
break;
default:
vpr_printf(TIO_MESSAGE_ERROR,"(File:%s,[LINE%d])Invalid topology for spice model (%s)!\n",
__FILE__, __LINE__, gate_spice_model->name);
exit(1);
}
/* Print timing info */
dump_verilog_submodule_timing(fp, gate_spice_model);
/* Print signal initialization */
dump_verilog_submodule_signal_init(fp, gate_spice_model);
fprintf(fp, "endmodule\n");
fprintf(fp, "\n");
/* Free */
my_free(input_port);
my_free(output_port);
return;
}
/* Dump Essential modules:
* 1. inverters
* 2. buffers
* 3. pass-gate logics */
static
void dump_verilog_submodule_essentials(char* verilog_dir, char* submodule_dir,
int num_spice_model,
t_spice_model* spice_models) {
int imodel;
char* verilog_name = my_strcat(submodule_dir, essentials_verilog_file_name);
FILE* fp = NULL;
/* Create file */
fp = fopen(verilog_name, "w");
if (NULL == fp) {
vpr_printf(TIO_MESSAGE_ERROR,"(FILE:%s,LINE[%d])Failure in create Verilog netlist %s",
__FILE__, __LINE__, essentials_verilog_file_name);
exit(1);
}
dump_verilog_file_header(fp,"Essential gates");
verilog_include_defines_preproc_file(fp, verilog_dir);
/* Output essential models*/
for (imodel = 0; imodel < num_spice_model; imodel++) {
/* By pass user-defined modules */
if (NULL != spice_models[imodel].verilog_netlist) {
continue;
}
if (SPICE_MODEL_INVBUF == spice_models[imodel].type) {
dump_verilog_invbuf_module(fp, &(spice_models[imodel]));
}
if (SPICE_MODEL_PASSGATE == spice_models[imodel].type) {
dump_verilog_passgate_module(fp, &(spice_models[imodel]));
}
if (SPICE_MODEL_GATE == spice_models[imodel].type) {
dump_verilog_gate_module(fp, &(spice_models[imodel]));
}
}
/* Close file handler*/
fclose(fp);
/* Add fname to the linked list */
submodule_verilog_subckt_file_path_head = add_one_subckt_file_name_to_llist(submodule_verilog_subckt_file_path_head, verilog_name);
/* Free */
return;
}
/* Dump a CMOS MUX basis module */ /* Dump a CMOS MUX basis module */
static static
void dump_verilog_cmos_mux_one_basis_module(FILE* fp, void dump_verilog_cmos_mux_one_basis_module(FILE* fp,
@ -4053,11 +3515,6 @@ void dump_verilog_submodules(t_sram_orgz_info* cur_sram_orgz_info,
/* 0. basic units: inverter, buffers and pass-gate logics, */ /* 0. basic units: inverter, buffers and pass-gate logics, */
vpr_printf(TIO_MESSAGE_INFO, "Generating essential modules...\n"); vpr_printf(TIO_MESSAGE_INFO, "Generating essential modules...\n");
/* To be removed when testing passed
dump_verilog_submodule_essentials(verilog_dir, submodule_dir,
Arch.spice->num_spice_model,
Arch.spice->spice_models);
*/
print_verilog_submodule_essentials(std::string(verilog_dir), print_verilog_submodule_essentials(std::string(verilog_dir),
std::string(submodule_dir), std::string(submodule_dir),
Arch.spice->circuit_lib); Arch.spice->circuit_lib);