summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/core/analog.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/core/analog.h')
-rw-r--r--src/lib/netlist/core/analog.h162
1 files changed, 162 insertions, 0 deletions
diff --git a/src/lib/netlist/core/analog.h b/src/lib/netlist/core/analog.h
new file mode 100644
index 00000000000..a868443b8d2
--- /dev/null
+++ b/src/lib/netlist/core/analog.h
@@ -0,0 +1,162 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+
+///
+/// \file param.h
+///
+
+#ifndef NL_CORE_ANALOG_H_
+#define NL_CORE_ANALOG_H_
+
+#include "../nltypes.h"
+#include "base_objects.h"
+#include "nets.h"
+
+#include "../plib/plists.h"
+#include "../plib/pstring.h"
+
+#include <array>
+#include <utility>
+
+namespace netlist
+{
+ // -----------------------------------------------------------------------------
+ // analog_t
+ // -----------------------------------------------------------------------------
+
+ class analog_t : public detail::core_terminal_t
+ {
+ public:
+
+ analog_t(core_device_t &dev, const pstring &aname, state_e state,
+ nldelegate delegate);
+
+ const analog_net_t & net() const noexcept
+ {
+ return plib::downcast<const analog_net_t &>(core_terminal_t::net());
+ }
+
+ analog_net_t & net() noexcept
+ {
+ return plib::downcast<analog_net_t &>(core_terminal_t::net());
+ }
+
+ solver::matrix_solver_t *solver() const noexcept;
+ };
+
+ /// \brief Base class for terminals.
+ ///
+ /// Each \ref nld_twoterm object consists of two terminals. Terminals
+ /// are at the core of analog netlists and are connected to \ref net_t
+ /// objects.
+ ///
+ class terminal_t : public analog_t
+ {
+ public:
+
+ /// \brief constructor
+ ///
+ /// @param dev core_devict_t object owning the terminal
+ /// @param aname name of this terminal
+ /// @param otherterm pointer to the sibling terminal
+ terminal_t(core_device_t &dev, const pstring &aname, terminal_t *otherterm, nldelegate delegate);
+
+ /// \brief Returns voltage of connected net
+ ///
+ /// @return voltage of net this terminal is connected to
+ nl_fptype operator ()() const noexcept
+ {
+ return net().Q_Analog();
+ }
+
+ /// @brief sets conductivity value of this terminal
+ ///
+ /// @param G Conductivity
+ void set_conductivity(nl_fptype G) const noexcept
+ {
+ set_go_gt_I(-G, G, nlconst::zero());
+ }
+
+ void set_go_gt(nl_fptype GO, nl_fptype GT) const noexcept
+ {
+ set_go_gt_I(GO, GT, nlconst::zero());
+ }
+
+ void set_go_gt_I(nl_fptype GO, nl_fptype GT, nl_fptype I) const noexcept
+ {
+ // Check for rail nets ...
+ if (m_go != nullptr)
+ {
+ *m_Idr = I;
+ *m_go = GO;
+ *m_gt = GT;
+ }
+ }
+
+ void set_ptrs(nl_fptype *gt, nl_fptype *go, nl_fptype *Idr) noexcept(false);
+
+ private:
+ nl_fptype *m_Idr; ///< drive current
+ nl_fptype *m_go; ///< conductance for Voltage from other term
+ nl_fptype *m_gt; ///< conductance for total conductance
+
+ };
+
+ // -----------------------------------------------------------------------------
+ // analog_input_t
+ // -----------------------------------------------------------------------------
+
+ /// \brief terminal providing analog input voltage.
+ ///
+ /// This terminal class provides a voltage measurement. The conductance against
+ /// ground is infinite.
+
+ class analog_input_t : public analog_t
+ {
+ public:
+ /// \brief Constructor
+ analog_input_t(core_device_t &dev, ///< owning device
+ const pstring &aname, ///< name of terminal
+ nldelegate delegate ///< delegate
+ );
+
+ /// \brief returns voltage at terminal.
+ /// \returns voltage at terminal.
+ nl_fptype operator()() const noexcept { return Q_Analog(); }
+
+ /// \brief returns voltage at terminal.
+ /// \returns voltage at terminal.
+ nl_fptype Q_Analog() const noexcept
+ {
+ return net().Q_Analog();
+ }
+ };
+
+ // -----------------------------------------------------------------------------
+ // analog_output_t
+ // -----------------------------------------------------------------------------
+
+ class analog_output_t : public analog_t
+ {
+ public:
+ analog_output_t(core_device_t &dev, const pstring &aname);
+
+ void push(nl_fptype val) noexcept
+ {
+ if (val != m_my_net.Q_Analog())
+ {
+ m_my_net.set_Q_Analog(val);
+ m_my_net.toggle_and_push_to_queue(netlist_time::quantum());
+ }
+ }
+
+ void initial(nl_fptype val) noexcept;
+
+ private:
+ analog_net_t m_my_net;
+ };
+
+} // namespace netlist
+
+
+#endif // NL_CORE_ANALOG_H_