From 9414a219a950297ececac52675c083eaed4d66eb Mon Sep 17 00:00:00 2001 From: Aaron Giles Date: Sat, 1 Aug 2020 18:26:52 +0200 Subject: [PATCH] netlist: Added CD4017/4022 devices. * Also contains squashed clang signedness fixes --- scripts/src/netlist.lua | 2 + src/lib/netlist/build/makefile | 1 + src/lib/netlist/devices/net_lib.cpp | 2 + src/lib/netlist/devices/net_lib.h | 1 + src/lib/netlist/devices/nld_4017.cpp | 86 ++++++++++++++++++++++++++++ src/lib/netlist/devices/nld_4017.h | 51 +++++++++++++++++ src/lib/netlist/devices/nld_devinc.h | 19 ++++++ src/lib/netlist/macro/nlm_cd4xxx.cpp | 64 +++++++++++++++++++++ src/lib/netlist/macro/nlm_cd4xxx.h | 6 ++ 9 files changed, 232 insertions(+) create mode 100644 src/lib/netlist/devices/nld_4017.cpp create mode 100644 src/lib/netlist/devices/nld_4017.h diff --git a/scripts/src/netlist.lua b/scripts/src/netlist.lua index 481f2add692..2607d419576 100644 --- a/scripts/src/netlist.lua +++ b/scripts/src/netlist.lua @@ -138,6 +138,8 @@ project "netlist" MAME_DIR .. "src/lib/netlist/devices/nld_4006.h", MAME_DIR .. "src/lib/netlist/devices/nld_4013.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_4013.h", + MAME_DIR .. "src/lib/netlist/devices/nld_4017.cpp", + MAME_DIR .. "src/lib/netlist/devices/nld_4017.h", MAME_DIR .. "src/lib/netlist/devices/nld_4020.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_4020.h", MAME_DIR .. "src/lib/netlist/devices/nld_4053.cpp", diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile index 9e10f19a60c..c4ad5397515 100644 --- a/src/lib/netlist/build/makefile +++ b/src/lib/netlist/build/makefile @@ -154,6 +154,7 @@ NLOBJS := \ $(NLOBJ)/devices/nld_tms4800.o \ $(NLOBJ)/devices/nld_4006.o \ $(NLOBJ)/devices/nld_4013.o \ + $(NLOBJ)/devices/nld_4017.o \ $(NLOBJ)/devices/nld_4020.o \ $(NLOBJ)/devices/nld_4053.o \ $(NLOBJ)/devices/nld_4066.o \ diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index 40510225b82..460d129dff1 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -142,6 +142,8 @@ namespace devices // FIXME: duplicate? LIB_ENTRY(CD4006) LIB_ENTRY(CD4006_dip) + LIB_ENTRY(CD4017) + LIB_ENTRY(CD4022) LIB_ENTRY(CD4020_WI) LIB_ENTRY(CD4020) LIB_ENTRY(CD4024) diff --git a/src/lib/netlist/devices/net_lib.h b/src/lib/netlist/devices/net_lib.h index 60040f4589f..c3d818de17d 100644 --- a/src/lib/netlist/devices/net_lib.h +++ b/src/lib/netlist/devices/net_lib.h @@ -48,6 +48,7 @@ NETLIST_EXTERNAL(ROMS_lib) #include "nld_2102A.h" #include "nld_4006.h" #include "nld_4013.h" +#include "nld_4017.h" #include "nld_4020.h" #include "nld_4053.h" #include "nld_4066.h" diff --git a/src/lib/netlist/devices/nld_4017.cpp b/src/lib/netlist/devices/nld_4017.cpp new file mode 100644 index 00000000000..c396ff73cd2 --- /dev/null +++ b/src/lib/netlist/devices/nld_4017.cpp @@ -0,0 +1,86 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud +/* + * nld_4017.c + * + */ + +#include "nld_4017.h" +#include "nl_base.h" +#include "nl_factory.h" + +namespace netlist +{ + namespace devices + { + + template + NETLIB_OBJECT(CD4017_base) + { + NETLIB_CONSTRUCTOR_MODEL(CD4017_base, "CD4XXX") + , m_CLK(*this, "CLK", NETLIB_DELEGATE(clk)) + , m_CLKEN(*this, "CLKEN", NETLIB_DELEGATE(inputs)) + , m_RESET(*this, "RESET", NETLIB_DELEGATE(inputs)) + , m_CO(*this, "CO") + , m_Q(*this, 0, "Q{}") + , m_cnt(*this, "m_cnt", 0) + , m_supply(*this) + { + } + + NETLIB_RESETI() + { + m_CLK.set_state(logic_t::STATE_INP_LH); + m_cnt = 0; + } + + NETLIB_HANDLERI(clk) + { + ++m_cnt; + update_outputs(m_cnt); + } + + NETLIB_HANDLERI(inputs) + { + if (m_RESET()) + { + m_CLK.inactivate(); + m_cnt = 0; + update_outputs(m_cnt); + } + else if (m_CLKEN()) + { + m_CLK.inactivate(); + } + else + { + m_CLK.activate_lh(); + } + } + + public: + void update_outputs(const unsigned cnt) noexcept + { + for (std::size_t i = 0; i < _MaxCount; i++) + m_Q[i].push(i == cnt, NLTIME_FROM_NS(200)); + m_CO.push(cnt < _MaxCount / 2, NLTIME_FROM_NS(160)); + } + logic_input_t m_CLK; + logic_input_t m_CLKEN; + logic_input_t m_RESET; + logic_output_t m_CO; + object_array_t m_Q; + + state_var m_cnt; + nld_power_pins m_supply; + }; + + using NETLIB_NAME(CD4017) = NETLIB_NAME(CD4017_base)<10>; + using NETLIB_NAME(CD4022) = NETLIB_NAME(CD4017_base)<8>; + + + NETLIB_DEVICE_IMPL(CD4017, "CD4017", "") + NETLIB_DEVICE_IMPL(CD4022, "CD4022", "") + + } //namespace devices +} // namespace netlist diff --git a/src/lib/netlist/devices/nld_4017.h b/src/lib/netlist/devices/nld_4017.h new file mode 100644 index 00000000000..58ff0dabcb9 --- /dev/null +++ b/src/lib/netlist/devices/nld_4017.h @@ -0,0 +1,51 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud +/* + * nld_4017.h + * + * CD4017: Decade Counter/Divider with 10 Decoded Outputs + * + * +--------------+ + * Q5 |1 ++ 16| VDD + * Q1 |2 15| RESET + * Q0 |3 14| CLOCK + * Q2 |4 4017 13| CLOCK ENABLE + * Q6 |5 12| CARRY OUT + * Q7 |6 11| Q9 + * Q3 |7 10| Q4 + * VSS |8 9| Q8 + * +--------------+ + * + * + * CD4022: Divide-by-8 Counter/Divider with 8 Decoded Outputs + * + * +--------------+ + * Q1 |1 ++ 16| VDD + * Q0 |2 15| RESET + * Q2 |3 14| CLOCK + * Q5 |4 4022 13| CLOCK ENABLE + * Q6 |5 12| CARRY OUT + * NC |6 11| Q4 + * Q3 |7 10| Q7 + * VSS |8 9| NC + * +--------------+ + * + * Naming conventions follow Fairchild datasheet + * + * FIXME: Timing depends on VDD-VSS + * This needs a cmos d-a/a-d proxy implementation. + * + */ + +#ifndef NLD_4017_H_ +#define NLD_4017_H_ + +#include "netlist/nl_setup.h" + +#define CD4017(name) \ + NET_REGISTER_DEV(CD4017, name) + +#define CD4022(name) \ + NET_REGISTER_DEV(CD4022, name) + +#endif /* NLD_4017_H_ */ diff --git a/src/lib/netlist/devices/nld_devinc.h b/src/lib/netlist/devices/nld_devinc.h index 260c794763d..371bdb6f59b 100644 --- a/src/lib/netlist/devices/nld_devinc.h +++ b/src/lib/netlist/devices/nld_devinc.h @@ -684,6 +684,17 @@ #define CD4006_DIP(...) \ NET_REGISTER_DEVEXT(CD4006_DIP, __VA_ARGS__) +// --------------------------------------------------------------------- +// Source: src/lib/netlist/devices/nld_4017.cpp +// --------------------------------------------------------------------- +// usage : CD4017(name) +#define CD4017(...) \ + NET_REGISTER_DEVEXT(CD4017, __VA_ARGS__) + +// usage : CD4022(name) +#define CD4022(...) \ + NET_REGISTER_DEVEXT(CD4022, __VA_ARGS__) + // --------------------------------------------------------------------- // Source: src/lib/netlist/devices/nld_4020.cpp // --------------------------------------------------------------------- @@ -1264,6 +1275,14 @@ #define CD4013_DIP(...) \ NET_REGISTER_DEVEXT(CD4013_DIP, __VA_ARGS__) +// usage : CD4017_DIP(name) +#define CD4017_DIP(...) \ + NET_REGISTER_DEVEXT(CD4017_DIP, __VA_ARGS__) + +// usage : CD4022_DIP(name) +#define CD4022_DIP(...) \ + NET_REGISTER_DEVEXT(CD4022_DIP, __VA_ARGS__) + // usage : CD4020_DIP(name) #define CD4020_DIP(...) \ NET_REGISTER_DEVEXT(CD4020_DIP, __VA_ARGS__) diff --git a/src/lib/netlist/macro/nlm_cd4xxx.cpp b/src/lib/netlist/macro/nlm_cd4xxx.cpp index 3da618b866c..e948b6786d6 100644 --- a/src/lib/netlist/macro/nlm_cd4xxx.cpp +++ b/src/lib/netlist/macro/nlm_cd4xxx.cpp @@ -113,6 +113,68 @@ static NETLIST_START(CD4013_DIP) ) NETLIST_END() +/* + * CD4017: Decade Counter/Divider with 10 Decoded Outputs + * + * +--------------+ + * Q5 |1 ++ 16| VDD + * Q1 |2 15| RESET + * Q0 |3 14| CLOCK + * Q2 |4 4017 13| CLOCK ENABLE + * Q6 |5 12| CARRY OUT + * Q7 |6 11| Q9 + * Q3 |7 10| Q4 + * VSS |8 9| Q8 + * +--------------+ + * + * + * CD4022: Divide-by-8 Counter/Divider with 8 Decoded Outputs + * + * +--------------+ + * Q1 |1 ++ 16| VDD + * Q0 |2 15| RESET + * Q2 |3 14| CLOCK + * Q5 |4 4022 13| CLOCK ENABLE + * Q6 |5 12| CARRY OUT + * NC |6 11| Q4 + * Q3 |7 10| Q7 + * VSS |8 9| NC + * +--------------+ + */ + +static NETLIST_START(CD4017_DIP) + CD4017(A) + + DIPPINS( /* +--------------+ */ + A.Q5, /* Q5 |1 ++ 16| VDD */ A.VDD, + A.Q1, /* Q1 |2 15| RESET */ A.RESET, + A.Q0, /* Q0 |3 14| CLOCK */ A.CLK, + A.Q2, /* Q2 |4 4017 13| CLOCK ENABLE */ A.CLKEN, + A.Q6, /* Q6 |5 12| CARRY OUT */ A.CO, + A.Q7, /* Q7 |6 11| Q9 */ A.Q9, + A.Q3, /* Q3 |7 10| Q4 */ A.Q4, + A.VSS, /* VSS |8 9| Q8 */ A.Q8 + /* +--------------+ */ + ) +NETLIST_END() + +static NETLIST_START(CD4022_DIP) + CD4022(A) + NC_PIN(NC) + + DIPPINS( /* +--------------+ */ + A.Q1, /* Q1 |1 ++ 16| VDD */ A.VDD, + A.Q0, /* Q0 |2 15| RESET */ A.RESET, + A.Q2, /* Q2 |3 14| CLOCK */ A.CLK, + A.Q5, /* Q5 |4 4022 13| CLOCK ENABLE */ A.CLKEN, + A.Q6, /* Q6 |5 12| CARRY OUT */ A.CO, + NC.I, /* NC |6 11| Q4 */ A.Q4, + A.Q3, /* Q3 |7 10| Q7 */ A.Q7, + A.VSS, /* VSS |8 9| NC */ NC.I + /* +--------------+ */ + ) +NETLIST_END() + /* CD4020: 14-Stage Ripple Carry Binary Counters * * +--------------+ @@ -508,6 +570,8 @@ NETLIST_START(CD4XXX_lib) /* DIP ONLY */ LOCAL_LIB_ENTRY(CD4013_DIP) + LOCAL_LIB_ENTRY(CD4017_DIP) + LOCAL_LIB_ENTRY(CD4022_DIP) LOCAL_LIB_ENTRY(CD4020_DIP) LOCAL_LIB_ENTRY(CD4024_DIP) LOCAL_LIB_ENTRY(CD4053_DIP) diff --git a/src/lib/netlist/macro/nlm_cd4xxx.h b/src/lib/netlist/macro/nlm_cd4xxx.h index 7e56a515923..8db793216b1 100644 --- a/src/lib/netlist/macro/nlm_cd4xxx.h +++ b/src/lib/netlist/macro/nlm_cd4xxx.h @@ -61,6 +61,12 @@ #define CD4013_DIP(name) \ NET_REGISTER_DEV(CD4013_DIP, name) +#define CD4017_DIP(name) \ + NET_REGISTER_DEV(CD4017_DIP, name) + +#define CD4022_DIP(name) \ + NET_REGISTER_DEV(CD4022_DIP, name) + #define CD4020_DIP(name) \ NET_REGISTER_DEV(CD4020_DIP, name)