sim_signal.h Source File

yasimavr: sim_signal.h Source File
yasimavr
Loading...
Searching...
No Matches
sim_signal.h
Go to the documentation of this file.
1/*
2 * sim_signal.h
3 *
4 * Copyright 2021-2024 Clement Savergne <csavergne@yahoo.com>
5
6 This file is part of yasim-avr.
7
8 yasim-avr is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12
13 yasim-avr is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with yasim-avr. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22//=======================================================================================
23
24#ifndef __YASIMAVR_SIGNAL_H__
25#define __YASIMAVR_SIGNAL_H__
26
27#include "sim_types.h"
28#include <stdint.h>
29#include <vector>
30#include <unordered_map>
31
33
34
35//=======================================================================================
40
41 int sigid;
42 long long index;
44
45};
46
47
48//=======================================================================================
49
50class Signal;
51
56
57public:
58
59 SignalHook() = default;
60 SignalHook(const SignalHook&);
61 SignalHook(const SignalHook&&) = delete;
62 virtual ~SignalHook();
63
71 virtual void raised(const signal_data_t& sigdata, int hooktag) = 0;
72
73 SignalHook& operator=(const SignalHook&);
74 SignalHook& operator=(const SignalHook&&) = delete;
75
76private:
77
78 friend class Signal;
79
80 std::vector<Signal*> m_signals;
81
82};
83
84
85//=======================================================================================
98
99public:
100
101 Signal();
102 Signal(const Signal& other);
103 Signal(const Signal&&) = delete;
104 virtual ~Signal();
105
106 void connect(SignalHook& hook, int hooktag = 0);
107 void disconnect(SignalHook& hook);
108
109 virtual void raise(const signal_data_t& sigdata);
110 void raise(int sigid = 0, const vardata_t& v = vardata_t(), long long index = 0);
111
112 Signal& operator=(const Signal&);
113 Signal& operator=(const Signal&&) = delete;
114
115private:
116
117 friend class SignalHook;
118
119 //Flag used to avoid nested raises
120 bool m_busy;
121
122 struct hook_slot_t {
123 SignalHook* hook;
124 int tag;
125 };
126
127 std::vector<hook_slot_t> m_hooks;
128
129 int hook_index(const SignalHook& hook) const;
130 int signal_index(const SignalHook& hook) const;
131
132};
133
134
135//=======================================================================================
136
138
139public:
140
141 vardata_t data(int sigid, long long index = 0) const;
142 bool has_data(int sigid, long long index = 0) const;
143 void set_data(int sigid, const vardata_t& v, long long index = 0);
144
145 void clear();
146
147 virtual void raise(const signal_data_t& sigdata) override;
148 using Signal::raise;
149
150private:
151
152 struct key_t {
153 int sigid;
154 long long index;
155 bool operator==(const key_t& other) const;
156 };
157
158 struct keyhash_t {
159 size_t operator()(const key_t& k) const;
160 };
161
162 std::unordered_map<key_t, vardata_t, keyhash_t> m_data;
163
164};
165
166
167//=======================================================================================
168
170
171public:
172
174
175 virtual void raised(const signal_data_t& sigdata, int hooktag) override;
176
177 size_t add_mux();
178 size_t add_mux(DataSignal& signal);
179 size_t add_mux(DataSignal& signal, int sigid_filt);
180 size_t add_mux(DataSignal& signal, int sigid_filt, long long ix_filt);
181
182 DataSignal& signal();
183
184 void set_selection(size_t index);
185 size_t selected_index() const;
186 bool connected() const;
187
188private:
189
190 struct mux_item_t {
191 DataSignal* signal;
192 int sigid_filt;
193 long long index_filt;
194 uint8_t filt_mask;
195 vardata_t data;
196
197 bool match(const signal_data_t& sigdata) const;
198 };
199
200 std::vector<mux_item_t> m_items;
201 DataSignal m_signal;
202 size_t m_sel_index;
203
204 size_t add_mux(mux_item_t& item);
205
206};
207
209{
210 return m_signal;
211}
212
213inline size_t DataSignalMux::selected_index() const
214{
215 return m_sel_index;
216}
217
218inline bool DataSignalMux::connected() const
219{
220 return (m_sel_index < m_items.size()) ? !!m_items[m_sel_index].signal : false;
221}
222
223
224//=======================================================================================
225
226template<class C>
228
229public:
230
231 using bound_fct_t = void(C::*)(const signal_data_t&, int);
232
233 constexpr BoundFunctionSignalHook(C& _c, bound_fct_t _f) : c(_c), f(_f) {}
234
235 virtual void raised(const signal_data_t& sigdata, int hooktag) override final
236 {
237 (c.*f)(sigdata, hooktag);
238 }
239
240private:
241
242 C& c;
243 bound_fct_t f;
244
245};
246
247
249
250#endif //__YASIMAVR_SIGNAL_H__
Definition sim_signal.h:227
virtual void raised(const signal_data_t &sigdata, int hooktag) override final
Definition sim_signal.h:235
constexpr BoundFunctionSignalHook(C &_c, bound_fct_t _f)
Definition sim_signal.h:233
void(C::*)(const signal_data_t &, int) bound_fct_t
Definition sim_signal.h:231
Definition sim_signal.h:137
Definition sim_signal.h:169
bool connected() const
Definition sim_signal.h:218
size_t selected_index() const
Definition sim_signal.h:213
DataSignal & signal()
Definition sim_signal.h:208
Definition sim_signal.h:55
SignalHook()=default
SignalHook(const SignalHook &&)=delete
SignalHook & operator=(const SignalHook &&)=delete
virtual void raised(const signal_data_t &sigdata, int hooktag)=0
Signalling framework class.
Definition sim_signal.h:97
Signal(const Signal &&)=delete
Signal & operator=(const Signal &&)=delete
virtual void raise(const signal_data_t &sigdata)
Definition sim_signal.cpp:142
Definition sim_types.h:495
#define YASIMAVR_BEGIN_NAMESPACE
Definition sim_globals.h:58
#define AVR_CORE_PUBLIC_API
Definition sim_globals.h:46
#define YASIMAVR_END_NAMESPACE
Definition sim_globals.h:59
constexpr bool operator==(reg_addr_t a, const regmask_t &rm)
Definition sim_types.h:184
Definition sim_signal.h:39
int sigid
Definition sim_signal.h:41
vardata_t data
Definition sim_signal.h:43
long long index
Definition sim_signal.h:42