Browse Source

Add inertial_delay=true to .model statements generated when U* instances in PSpice library subckts are translated to Xspice. Any other Xspice A* digital instances might have different inertial_delay settings in their models, so potentially there could be a mixture of delay types. For example, if a user wishes to model a DLYLINE using a d_buffer with inertial_delay=false and equal rise/fall delays.

pre-master-46
Brian Taylor 3 years ago
committed by Holger Vogt
parent
commit
40a540a2ff
  1. 26
      src/frontend/logicexp.c
  2. 30
      src/frontend/udevices.c

26
src/frontend/logicexp.c

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

30
src/frontend/udevices.c

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

Loading…
Cancel
Save