summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/nltypes.h
blob: 7d7582774b139951e268d3aa51a26fbb9cf3e9bf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// license:GPL-2.0+
// copyright-holders:Couriersud
/*!
 *
 * \file nltypes.h
 *
 */

/* \note never change the name to nl_types.h. This creates a conflict
 * with nl_types.h file provided by libc++ (clang, macosx)
 */

#ifndef NLTYPES_H_
#define NLTYPES_H_

#include "nl_config.h"
#include "plib/pchrono.h"
#include "plib/pfmtlog.h"
#include "plib/pmempool.h"
#include "plib/pstate.h"
#include "plib/pstring.h"
#include "plib/ptime.h"
#include "plib/putil.h"

#include <cstdint>
#include <unordered_map>

namespace netlist
{
	/*! @brief plib::constants struct specialized for nl_double
	 *
	 *  This may be any of bool, uint8_t, uint16_t, uin32_t and uint64_t.
	 *  The choice has little to no impact on performance.
	 */
	using constants = plib::constants<nl_double>;

	/*! @brief netlist_sig_t is the type used for logic signals.
	 *
	 *  This may be any of bool, uint8_t, uint16_t, uin32_t and uint64_t.
	 *  The choice has little to no impact on performance.
	 */
	using netlist_sig_t = std::uint32_t;

	/* FIXME: belongs into nl_base.h to nlstate */
	/**
	 * @brief Interface definition for netlist callbacks into calling code
	 *
	 * A class inheriting from netlist_callbacks_t has to be passed to the netlist_t
	 * constructor. Netlist does processing during construction and thus needs
	 * the object passed completely constructed.
	 *
	 */
	class callbacks_t
	{
	public:

		callbacks_t() = default;
		/* what is done before this is passed as a unique_ptr to netlist
		 * we should not limit.
		 */
		virtual ~callbacks_t() = default;
		COPYASSIGNMOVE(callbacks_t, default)

		/* logging callback */
		virtual void vlog(const plib::plog_level &l, const pstring &ls) const = 0;

	};

	using log_type =  plib::plog_base<callbacks_t, NL_DEBUG>;


	//============================================================
	//  Performance tracking
	//============================================================

	template<bool enabled_>
	using nperftime_t = plib::chrono::timer<plib::chrono::exact_ticks, enabled_>;

	template<bool enabled_>
	using nperfcount_t = plib::chrono::counter<enabled_>;

	//============================================================
	//  Types needed by various includes
	//============================================================

	/*! The memory pool for netlist objects
	 *
	 * \note This is not the right location yet.
	 *
	 */

#if (USE_MEMPOOL)
	using nlmempool = plib::mempool;
#else
	using nlmempool = plib::aligned_arena;
#endif

	/*! Owned pointer type for pooled allocations.
	 *
	 */
	template <typename T>
	using pool_owned_ptr = nlmempool::owned_pool_ptr<T>;

	inline nlmempool &pool()
	{
		static nlmempool static_pool;
		return static_pool;
	}

	namespace detail {

		/*! Enum specifying the type of object */
		enum terminal_type {
			TERMINAL = 0, /*!< object is an analog terminal */
			INPUT    = 1, /*!< object is an input */
			OUTPUT   = 2, /*!< object is an output */
		};

	} // namespace detail

#if (PHAS_INT128)
	using netlist_time = ptime<INT128, NETLIST_INTERNAL_RES>;
#else
	using netlist_time = plib::ptime<std::int64_t, NETLIST_INTERNAL_RES>;
	static_assert(noexcept(netlist_time::from_nsec(1)) == true, "Not evaluated as constexpr");
#endif

	//============================================================
	//  MACROS
	//============================================================

	template <typename T> inline constexpr const netlist_time NLTIME_FROM_NS(T &&t) noexcept { return netlist_time::from_nsec(t); }
	template <typename T> inline constexpr const netlist_time NLTIME_FROM_US(T &&t) noexcept { return netlist_time::from_usec(t); }
	template <typename T> inline constexpr const netlist_time NLTIME_FROM_MS(T &&t) noexcept { return netlist_time::from_msec(t); }

} // namespace netlist

namespace plib {

	template<>
	inline void state_manager_t::save_item(const void *owner, netlist::netlist_time &nlt, const pstring &stname)
	{
		save_state_ptr(owner, stname, datatype_t(sizeof(netlist::netlist_time::internal_type), true, false), 1, nlt.get_internaltype_ptr());
	}
} // namespace plib

#endif /* NLTYPES_H_ */