Add drive 0/1 for $d_lo/$d_hi.

This commit is contained in:
Brian Taylor 2022-10-21 11:27:57 -07:00 committed by Holger Vogt
parent 2e064db79a
commit db81d7ca28
1 changed files with 61 additions and 31 deletions

View File

@ -297,6 +297,7 @@ static NAME_ENTRY port_names_list = NULL;
static unsigned int num_name_collisions = 0;
/* .model d_zero_inv99 d_inverter just once per subckt */
static BOOL add_zero_delay_inverter_model = FALSE;
static BOOL add_drive_hilo = FALSE;
static char *current_subckt = NULL;
static unsigned int subckt_msg_count = 0;
@ -720,6 +721,29 @@ struct card *replacement_udevice_cards(void)
x = create_xlate_translated(".model d_zero_inv99 d_inverter");
translated_p = add_xlator(translated_p, x);
}
if (add_drive_hilo) {
x = create_xlate_translated(".subckt hilo_dollar___lo drive___0");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated("a1 0 drive___0 dbuf1");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated(".model dbuf1 d_buffer");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated(".ends hilo_dollar___lo");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated(".subckt hilo_dollar___hi drive___1");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated("a2 0 drive___1 dinv1");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated(".model dinv1 d_inverter");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated(".ends hilo_dollar___hi");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated("x8100000 hilo_drive___1 hilo_dollar___hi");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated("x8100001 hilo_drive___0 hilo_dollar___lo");
translated_p = add_xlator(translated_p, x);
}
for (x = first_xlator(translated_p); x; x = next_xlator(translated_p)) {
if (ps_port_directions >= 2) {
printf("TRANS_OUT %s\n", x->translated);
@ -791,6 +815,7 @@ void initialize_udevice(char *subckt_line)
(void) add_xlator(default_models, xdata);
/* reset for the new subckt */
add_zero_delay_inverter_model = FALSE;
add_drive_hilo = FALSE;
}
static void determine_port_type(void)
@ -834,6 +859,7 @@ void cleanup_udevice(void)
delete_xlator(default_models);
default_models = NULL;
add_zero_delay_inverter_model = FALSE;
add_drive_hilo = FALSE;
clear_name_list(input_names_list, "INPUT_PINS");
input_names_list = NULL;
clear_name_list(output_names_list, "OUTPUT_PINS");
@ -2708,6 +2734,25 @@ static BOOL u_process_model(char *nline, char *original)
return retval;
}
static char *get_name_hilo(char *tok_str)
{
char *name = NULL;
if (eq(tok_str, "$d_hi")) {
name = TMALLOC(char, strlen("hilo_drive___1") + 1);
strcpy(name, "hilo_drive___1");
add_drive_hilo = TRUE;
} else if (eq(tok_str, "$d_lo")) {
name = TMALLOC(char, strlen("hilo_drive___0") + 1);
strcpy(name, "hilo_drive___0");
add_drive_hilo = TRUE;
} else {
name = TMALLOC(char, strlen(tok_str) + 1);
(void) memcpy(name, tok_str, strlen(tok_str) + 1);
}
return name;
}
static struct dff_instance *add_dff_inout_timing_model(
struct instance_hdr *hdr, char *start)
{
@ -2735,9 +2780,7 @@ static struct dff_instance *add_dff_inout_timing_model(
arrp = dffip->d_in;
for (i = 0; i < num_gates; i++) {
tok = strtok(NULL, " \t");
name = TMALLOC(char, strlen(tok) + 1);
(void) memcpy(name, tok, strlen(tok) + 1);
arrp[i] = name;
arrp[i] = get_name_hilo(tok);
}
/* q_out outputs */
dffip->q_out = TMALLOC(char *, num_gates);
@ -2766,7 +2809,7 @@ static struct dff_instance *add_dff_inout_timing_model(
/* Reject incompatible inputs */
arrp = dffip->d_in;
for (i = 0; i < num_gates; i++) {
if (strncmp(arrp[i], "$d_", 3) == 0) {
if (eq(arrp[i], "$d_nc")) {
delete_dff_instance(dffip);
return NULL;
}
@ -2795,7 +2838,7 @@ static struct dltch_instance *add_dltch_inout_timing_model(
dlp->num_gates = num_gates;
copyline = TMALLOC(char, strlen(start) + 1);
(void) memcpy(copyline, start, strlen(start) + 1);
/* prebar, clrbar, clk */
/* prebar, clrbar, clk(gate) */
tok = strtok(copyline, " \t");
dlp->prebar = TMALLOC(char, strlen(tok) + 1);
(void) memcpy(dlp->prebar, tok, strlen(tok) + 1);
@ -2803,16 +2846,14 @@ static struct dltch_instance *add_dltch_inout_timing_model(
dlp->clrbar = TMALLOC(char, strlen(tok) + 1);
(void) memcpy(dlp->clrbar, tok, strlen(tok) + 1);
tok = strtok(NULL, " \t");
dlp->gate = TMALLOC(char, strlen(tok) + 1);
(void) memcpy(dlp->gate, tok, strlen(tok) + 1);
dlp->gate = get_name_hilo(tok);
/* d inputs */
dlp->d_in = TMALLOC(char *, num_gates);
arrp = dlp->d_in;
for (i = 0; i < num_gates; i++) {
tok = strtok(NULL, " \t");
name = TMALLOC(char, strlen(tok) + 1);
(void) memcpy(name, tok, strlen(tok) + 1);
arrp[i] = name;
arrp[i] = get_name_hilo(tok);
}
/* q_out outputs */
dlp->q_out = TMALLOC(char *, num_gates);
@ -2841,12 +2882,12 @@ static struct dltch_instance *add_dltch_inout_timing_model(
/* Reject incompatible inputs */
arrp = dlp->d_in;
for (i = 0; i < num_gates; i++) {
if (strncmp(arrp[i], "$d_", 3) == 0) {
if (eq(arrp[i], "$d_nc")) {
delete_dltch_instance(dlp);
return NULL;
}
}
if (strncmp(dlp->gate, "$d_", 3) == 0) {
if (eq(dlp->gate, "$d_nc")) {
delete_dltch_instance(dlp);
return NULL;
}
@ -2888,18 +2929,14 @@ static struct jkff_instance *add_jkff_inout_timing_model(
arrp = jkffip->j_in;
for (i = 0; i < num_gates; i++) {
tok = strtok(NULL, " \t");
name = TMALLOC(char, strlen(tok) + 1);
(void) memcpy(name, tok, strlen(tok) + 1);
arrp[i] = name;
arrp[i] = get_name_hilo(tok);
}
/* k inputs */
jkffip->k_in = TMALLOC(char *, num_gates);
arrp = jkffip->k_in;
for (i = 0; i < num_gates; i++) {
tok = strtok(NULL, " \t");
name = TMALLOC(char, strlen(tok) + 1);
(void) memcpy(name, tok, strlen(tok) + 1);
arrp[i] = name;
arrp[i] = get_name_hilo(tok);
}
/* q_out outputs */
jkffip->q_out = TMALLOC(char *, num_gates);
@ -2929,8 +2966,7 @@ static struct jkff_instance *add_jkff_inout_timing_model(
arrp = jkffip->j_in;
arrpk = jkffip->k_in;
for (i = 0; i < num_gates; i++) {
if (strncmp(arrp[i], "$d_", 3) == 0 ||
strncmp(arrpk[i], "$d_", 3) == 0) {
if (eq(arrp[i], "$d_nc") || eq(arrpk[i], "$d_nc")) {
delete_jkff_instance(jkffip);
return NULL;
}
@ -2969,26 +3005,21 @@ static struct srff_instance *add_srff_inout_timing_model(
(void) memcpy(srffp->clrbar, tok, strlen(tok) + 1);
tok = strtok(NULL, " \t");
srffp->gate = TMALLOC(char, strlen(tok) + 1);
(void) memcpy(srffp->gate, tok, strlen(tok) + 1);
srffp->gate = get_name_hilo(tok);
/* s inputs */
srffp->s_in = TMALLOC(char *, num_gates);
arrp = srffp->s_in;
for (i = 0; i < num_gates; i++) {
tok = strtok(NULL, " \t");
name = TMALLOC(char, strlen(tok) + 1);
(void) memcpy(name, tok, strlen(tok) + 1);
arrp[i] = name;
arrp[i] = get_name_hilo(tok);
}
/* r inputs */
srffp->r_in = TMALLOC(char *, num_gates);
arrp = srffp->r_in;
for (i = 0; i < num_gates; i++) {
tok = strtok(NULL, " \t");
name = TMALLOC(char, strlen(tok) + 1);
(void) memcpy(name, tok, strlen(tok) + 1);
arrp[i] = name;
arrp[i] = get_name_hilo(tok);
}
/* q_out outputs */
srffp->q_out = TMALLOC(char *, num_gates);
@ -3018,13 +3049,12 @@ static struct srff_instance *add_srff_inout_timing_model(
arrp = srffp->s_in;
arrpr = srffp->r_in;
for (i = 0; i < num_gates; i++) {
if (strncmp(arrp[i], "$d_", 3) == 0 ||
strncmp(arrpr[i], "$d_", 3) == 0) {
if (eq(arrp[i], "$d_nc") || eq(arrpr[i], "$d_nc")) {
delete_srff_instance(srffp);
return NULL;
}
}
if (strncmp(srffp->gate, "$d_", 3) == 0) {
if (eq(srffp->gate, "$d_nc")) {
delete_srff_instance(srffp);
return NULL;
}