The intent now is to rely on a variable setting in .spiceinit to control the use of inertial delay XSPICE digital models. This will apply to U* instances in subcircuits which are translated to XSPICE.

This commit is contained in:
Brian Taylor 2023-03-10 11:40:37 -08:00 committed by Holger Vogt
parent 86951501a7
commit 164db58404
2 changed files with 28 additions and 28 deletions

View File

@ -680,47 +680,47 @@ static void gen_models(void)
ds_clear(&model);
ds_cat_printf(&model,
".model d_inv_zero_delay d_inverter(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)");
".model d_inv_zero_delay d_inverter(rise_delay=1.0e-12 fall_delay=1.0e-12)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
ds_cat_printf(&model,
".model d__inverter__1 d_inverter(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)");
".model d__inverter__1 d_inverter(rise_delay=1.0e-12 fall_delay=1.0e-12)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
ds_cat_printf(&model,
".model d__buffer__1 d_buffer(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)");
".model d__buffer__1 d_buffer(rise_delay=1.0e-12 fall_delay=1.0e-12)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
ds_cat_printf(&model,
".model d__nand__1 d_nand(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)");
".model d__nand__1 d_nand(rise_delay=1.0e-12 fall_delay=1.0e-12)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
ds_cat_printf(&model,
".model d__and__1 d_and(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)");
".model d__and__1 d_and(rise_delay=1.0e-12 fall_delay=1.0e-12)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
ds_cat_printf(&model,
".model d__xnor__1 d_xnor(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)");
".model d__xnor__1 d_xnor(rise_delay=1.0e-12 fall_delay=1.0e-12)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
ds_cat_printf(&model,
".model d__xor__1 d_xor(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)");
".model d__xor__1 d_xor(rise_delay=1.0e-12 fall_delay=1.0e-12)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
ds_cat_printf(&model,
".model d__nor__1 d_nor(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)");
".model d__nor__1 d_nor(rise_delay=1.0e-12 fall_delay=1.0e-12)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
ds_cat_printf(&model,
".model d__or__1 d_or(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)");
".model d__or__1 d_or(rise_delay=1.0e-12 fall_delay=1.0e-12)");
u_add_instance(ds_get_buf(&model));
ds_free(&model);
@ -2027,11 +2027,11 @@ static BOOL extract_delay(
if (ds_get_length(&dtyp_max_str) > 0) {
if (tri) {
ds_cat_printf(&delay_string,
"(inertial_delay=true delay=%s)",
"(delay=%s)",
ds_get_buf(&dtyp_max_str));
} else {
ds_cat_printf(&delay_string,
"(inertial_delay=true rise_delay=%s fall_delay=%s)",
"(rise_delay=%s fall_delay=%s)",
ds_get_buf(&dtyp_max_str),
ds_get_buf(&dtyp_max_str));
}
@ -2039,10 +2039,10 @@ static BOOL extract_delay(
printf("WARNING pindly DELAY not found\n");
if (tri) {
ds_cat_printf(&delay_string,
"(inertial_delay=true delay=10ns)");
"(delay=10ns)");
} else {
ds_cat_printf(&delay_string,
"(inertial_delay=true rise_delay=10ns fall_delay=10ns)");
"(rise_delay=10ns fall_delay=10ns)");
}
}
for (i = 0; i < idx; i++) {

View File

@ -748,7 +748,7 @@ struct card *replacement_udevice_cards(void)
}
if (add_zero_delay_inverter_model) {
x = create_xlate_translated(
".model d_zero_inv99 d_inverter(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)");
".model d_zero_inv99 d_inverter(rise_delay=1.0e-12 fall_delay=1.0e-12)");
translated_p = add_xlator(translated_p, x);
}
if (add_drive_hilo) {
@ -757,7 +757,7 @@ struct card *replacement_udevice_cards(void)
x = create_xlate_translated("a1 0 drive___0 dbuf1");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated(
".model dbuf1 d_buffer(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)");
".model dbuf1 d_buffer(rise_delay=1.0e-12 fall_delay=1.0e-12)");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated(".ends hilo_dollar___lo");
translated_p = add_xlator(translated_p, x);
@ -766,7 +766,7 @@ struct card *replacement_udevice_cards(void)
x = create_xlate_translated("a2 0 drive___1 dinv1");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated(
".model dinv1 d_inverter(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)");
".model dinv1 d_inverter(rise_delay=1.0e-12 fall_delay=1.0e-12)");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated(".ends hilo_dollar___hi");
translated_p = add_xlator(translated_p, x);
@ -891,7 +891,7 @@ void initialize_udevice(char *subckt_line)
model_xlatorp = create_xlator();
default_models = create_xlator();
/* .model d0_gate ugate () */
xdata = create_xlate("", "(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)",
xdata = create_xlate("", "(rise_delay=1.0e-12 fall_delay=1.0e-12)",
"ugate", "", "d0_gate", "");
(void) add_xlator(default_models, xdata);
/* .model d0_gff ugff () */
@ -903,7 +903,7 @@ void initialize_udevice(char *subckt_line)
xdata = create_xlate("", "", "ueff", "", "d0_eff", "");
(void) add_xlator(default_models, xdata);
/* .model d0_tgate utgate () */
xdata = create_xlate("", "(inertial_delay=true delay=1.0e-12)",
xdata = create_xlate("", "(delay=1.0e-12)",
"utgate", "", "d0_tgate", "");
(void) add_xlator(default_models, xdata);
/* reset for the new subckt */
@ -2618,7 +2618,7 @@ static char *larger_delay(char *delay1, char *delay2)
static char *get_zero_rise_fall(void)
{
/* The caller needs to tfree the returned string after use */
return tprintf("(inertial_delay=true rise_delay=1.0e-12 fall_delay=1.0e-12)");
return tprintf("(rise_delay=1.0e-12 fall_delay=1.0e-12)");
}
static char *get_delays_ugate(char *rem)
@ -2637,14 +2637,14 @@ static char *get_delays_ugate(char *rem)
has_falling = (falling && strlen(falling) > 0);
if (has_rising) {
if (has_falling) {
delays = tprintf("(inertial_delay=true rise_delay = %s fall_delay = %s)",
delays = tprintf("(rise_delay = %s fall_delay = %s)",
rising, falling);
} else {
delays = tprintf("(inertial_delay=true rise_delay = %s fall_delay = 1.0e-12)",
delays = tprintf("(rise_delay = %s fall_delay = 1.0e-12)",
rising);
}
} else if (has_falling) {
delays = tprintf("(inertial_delay=true rise_delay = 1.0e-12 fall_delay = %s)",
delays = tprintf("(rise_delay = 1.0e-12 fall_delay = %s)",
falling);
} else {
delays = get_zero_rise_fall();
@ -2675,12 +2675,12 @@ static char *get_delays_utgate(char *rem)
if (has_rising) {
if (has_falling) {
larger = larger_delay(rising, falling);
delays = tprintf("(inertial_delay=true delay = %s)", larger);
delays = tprintf("(delay = %s)", larger);
} else {
delays = tprintf("(inertial_delay=true delay = %s)", rising);
delays = tprintf("(delay = %s)", rising);
}
} else if (has_falling) {
delays = tprintf("(inertial_delay=true delay = %s)", falling);
delays = tprintf("(delay = %s)", falling);
} else if (use_zdelays) {
/* No lh/hl delays, so try the largest lz/hz/zl/zh delay */
tdp3 = create_min_typ_max("tplz", rem);
@ -2726,16 +2726,16 @@ static char *get_delays_utgate(char *rem)
larger3 = larger2;
}
if (larger3) {
delays = tprintf("(inertial_delay=true delay = %s)", larger3);
delays = tprintf("(delay = %s)", larger3);
} else {
delays = tprintf("(inertial_delay=true delay=1.0e-12)");
delays = tprintf("(delay=1.0e-12)");
}
delete_timing_data(tdp3);
delete_timing_data(tdp4);
delete_timing_data(tdp5);
delete_timing_data(tdp6);
} else { // Not use_zdelays
delays = tprintf("(inertial_delay=true delay=1.0e-12)");
delays = tprintf("(delay=1.0e-12)");
}
delete_timing_data(tdp1);
delete_timing_data(tdp2);