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 +