diff --git a/examples/p-to-n-examples/decoder.cir b/examples/p-to-n-examples/decoder.cir
new file mode 100644
index 000000000..86a7eb0c0
--- /dev/null
+++ b/examples/p-to-n-examples/decoder.cir
@@ -0,0 +1,80 @@
+decoder,cir
+
+*
+* ----------------------------------------------------------- 74145 ------
+* BCD-To-Decimal Decoders/Drivers
+*
+* The TTL Logic Data Book, 1988, TI Pages 2-447 to 2-449
+* bss 3/17/94
+*
+.SUBCKT 74145 A B C D O0 O1 O2 O3 O4 O5 O6 O7 O8 O9
++ optional: DPWR=$G_DPWR DGND=$G_DGND
++ params: MNTYMXDLY=0 IO_LEVEL=0
+
+U1LOG LOGICEXP(4,10) DPWR DGND
++ A B C D
++ O0_O O1_O O2_O O3_O O4_O O5_O O6_O O7_O O8_O O9_O
++ D0_GATE IO_STD MNTYMXDLY={MNTYMXDLY} IO_LEVEL={IO_LEVEL}
++
++ LOGIC:
++ abar = {~A}
++ bbar = {~B}
++ cbar = {~C}
++ dbar = {~D}
++ O0_O = {~(abar & bbar & cbar & dbar)}
++ O1_O = {~(A & bbar & cbar & dbar)}
++ O2_O = {~(abar & B & cbar & dbar)}
++ O3_O = {~(A & B & cbar & dbar)}
++ O4_O = {~(abar & bbar & C & dbar)}
++ O5_O = {~(A & bbar & C & dbar)}
++ O6_O = {~(abar & B & C & dbar)}
++ O7_O = {~(A & B & C & dbar)}
++ O8_O = {~(abar & bbar & cbar & D)}
++ O9_O = {~(A & bbar & cbar & D)}
+
+U2DLY PINDLY(10,0,0) DPWR DGND
++ O0_O O1_O O2_O O3_O O4_O O5_O O6_O O7_O O8_O O9_O
++ O0 O1 O2 O3 O4 O5 O6 O7 O8 O9
++ IO_STD MNTYMXDLY={MNTYMXDLY} IO_LEVEL={IO_LEVEL}
++
++ PINDLY:
++ O0 O1 O2 O3 O4 O5 O6 O7 O8 O9 = {
++ CASE(
++ DELAY(-1,-1,50ns))}
+
+.ENDS 74145
+*
+
+* U1 STIM(4,4) $G_DPWR $G_DGND D C B A
+* + IO_STD IO_LEVEL=0
+* + 0NS 0 LABEL=START 100NS INCR BY 1 200NS GOTO START -1 TIMES 1800NS 0
+
+X14 A B C D O0 O1 O2 O3 O4 O5 O6 O7 O8 O9 74145
+a1 [d c b a] input_vec1
+.model input_vec1 d_source(input_file = "decoder.stim")
+
+.TRAN 4e-008 2U 0
+.save all
+
+.control
+listing
+run
+eprint d c b a
+eprint o0 o1 o2 o3 o4 o5 o6 o7 o8 o9
+* save data to input directory
+cd $inputdir
+eprvcd a b c d o0 o1 o2 o3 o4 o5 o6 o7 o8 o9 > decoder.vcd
+* plotting the vcd file with GTKWave
+if $oscompiled = 1 | $oscompiled = 8 ; MS Windows
+ shell start gtkwave decoder.vcd --script nggtk.tcl
+else
+ if $oscompiled = 7 ; macOS, manual tweaking required (mark, insert, Zoom Fit)
+ shell open -a gtkwave decoder.vcd
+ else ; Linux and others
+ shell gtkwave decoder.vcd --script nggtk.tcl &
+ end
+end
+quit
+.endc
+
+.END
diff --git a/examples/p-to-n-examples/decoder.stim b/examples/p-to-n-examples/decoder.stim
new file mode 100644
index 000000000..e220d3a0e
--- /dev/null
+++ b/examples/p-to-n-examples/decoder.stim
@@ -0,0 +1,21 @@
+* T d c b a
+* i
+* m
+* e
+0ns 0s 0s 0s 0s
+100ns 0s 0s 0s 1s
+200ns 0s 0s 1s 0s
+300ns 0s 0s 1s 1s
+400ns 0s 1s 0s 0s
+500ns 0s 1s 0s 1s
+600ns 0s 1s 1s 0s
+700ns 0s 1s 1s 1s
+800ns 1s 0s 0s 0s
+900ns 1s 0s 0s 1s
+1.0us 1s 0s 1s 0s
+1.1us 1s 0s 1s 1s
+1.2us 1s 1s 0s 0s
+1.3us 1s 1s 0s 1s
+1.4us 1s 1s 1s 0s
+1.5us 1s 1s 1s 1s
+1.6us 0s 0s 0s 0s
diff --git a/src/frontend/logicexp.c b/src/frontend/logicexp.c
index f5632bf4e..448459cf7 100644
--- a/src/frontend/logicexp.c
+++ b/src/frontend/logicexp.c
@@ -628,39 +628,48 @@ static void gen_models(void)
DS_CREATE(model, 64);
ds_clear(&model);
- ds_cat_printf(&model, ".model d_inv_zero_delay d_inverter");
+ ds_cat_printf(&model,
+ ".model d_inv_zero_delay d_inverter(rise_delay=1.0e-11 fall_delay=1.0e-11)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
- ds_cat_printf(&model, ".model d__inverter__1 d_inverter");
+ ds_cat_printf(&model,
+ ".model d__inverter__1 d_inverter(rise_delay=1.0e-11 fall_delay=1.0e-11)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
- ds_cat_printf(&model, ".model d__buffer__1 d_buffer");
+ ds_cat_printf(&model,
+ ".model d__buffer__1 d_buffer(rise_delay=1.0e-11 fall_delay=1.0e-11)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
- ds_cat_printf(&model, ".model d__nand__1 d_nand");
+ ds_cat_printf(&model,
+ ".model d__nand__1 d_nand(rise_delay=1.0e-11 fall_delay=1.0e-11)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
- ds_cat_printf(&model, ".model d__and__1 d_and");
+ ds_cat_printf(&model,
+ ".model d__and__1 d_and(rise_delay=1.0e-11 fall_delay=1.0e-11)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
- ds_cat_printf(&model, ".model d__xnor__1 d_xnor");
+ ds_cat_printf(&model,
+ ".model d__xnor__1 d_xnor(rise_delay=1.0e-11 fall_delay=1.0e-11)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
- ds_cat_printf(&model, ".model d__xor__1 d_xor");
+ ds_cat_printf(&model,
+ ".model d__xor__1 d_xor(rise_delay=1.0e-11 fall_delay=1.0e-11)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
- ds_cat_printf(&model, ".model d__nor__1 d_nor");
+ ds_cat_printf(&model,
+ ".model d__nor__1 d_nor(rise_delay=1.0e-11 fall_delay=1.0e-11)");
u_add_instance(ds_get_buf(&model));
ds_clear(&model);
- ds_cat_printf(&model, ".model d__or__1 d_or");
+ ds_cat_printf(&model,
+ ".model d__or__1 d_or(rise_delay=1.0e-11 fall_delay=1.0e-11)");
u_add_instance(ds_get_buf(&model));
ds_free(&model);
diff --git a/src/frontend/udevices.c b/src/frontend/udevices.c
index 06c10b70e..000316e37 100644
--- a/src/frontend/udevices.c
+++ b/src/frontend/udevices.c
@@ -719,7 +719,8 @@ struct card *replacement_udevice_cards(void)
return NULL;
}
if (add_zero_delay_inverter_model) {
- x = create_xlate_translated(".model d_zero_inv99 d_inverter");
+ x = create_xlate_translated(
+ ".model d_zero_inv99 d_inverter(rise_delay=1.0e-11 fall_delay=1.0e-11)");
translated_p = add_xlator(translated_p, x);
}
if (add_drive_hilo) {
@@ -727,7 +728,8 @@ struct card *replacement_udevice_cards(void)
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");
+ x = create_xlate_translated(
+ ".model dbuf1 d_buffer(rise_delay=1.0e-11 fall_delay=1.0e-11)");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated(".ends hilo_dollar___lo");
translated_p = add_xlator(translated_p, x);
@@ -735,7 +737,8 @@ struct card *replacement_udevice_cards(void)
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");
+ x = create_xlate_translated(
+ ".model dinv1 d_inverter(rise_delay=1.0e-11 fall_delay=1.0e-11)");
translated_p = add_xlator(translated_p, x);
x = create_xlate_translated(".ends hilo_dollar___hi");
translated_p = add_xlator(translated_p, x);
@@ -2499,6 +2502,11 @@ static char *get_estimate(struct timing_data *tdp)
These functions are called from u_process_model(), and the delay strings
are added to the timing model Xlator by add_delays_to_model_xlator().
*/
+static char *get_zero_rise_fall(void)
+{
+ return tprintf("(rise_delay=1.0e-11 fall_delay=1.0e-11)");
+}
+
static char *get_delays_ugate(char *rem)
{
char *rising, *falling, *delays = NULL;
@@ -2514,7 +2522,11 @@ static char *get_delays_ugate(char *rem)
if (strlen(rising) > 0 && strlen(falling) > 0) {
delays = tprintf("(rise_delay = %s fall_delay = %s)",
rising, falling);
+ } else {
+ delays = get_zero_rise_fall();
}
+ } else {
+ delays = get_zero_rise_fall();
}
delete_timing_data(tdp1);
delete_timing_data(tdp2);
@@ -2536,7 +2548,11 @@ static char *get_delays_utgate(char *rem)
if (rising && falling) {
if (strlen(rising) > 0 && strlen(falling) > 0) {
delays = tprintf("(delay = %s)", rising);
+ } else {
+ delays = tprintf("(delay=1.0e-11)");
}
+ } else {
+ delays = tprintf("(delay=1.0e-11)");
}
delete_timing_data(tdp1);
delete_timing_data(tdp2);
diff --git a/visualc/vngspice.vcxproj b/visualc/vngspice.vcxproj
index d709cfd23..31779cdb3 100644
--- a/visualc/vngspice.vcxproj
+++ b/visualc/vngspice.vcxproj
@@ -1005,6 +1005,7 @@
+
@@ -1500,6 +1501,7 @@
+
@@ -2755,4 +2757,4 @@
-
\ No newline at end of file
+