sim_types.h Source File

yasimavr: sim_types.h Source File
yasimavr
Loading...
Searching...
No Matches
sim_types.h
Go to the documentation of this file.
1/*
2 * sim_types.h
3 *
4 * Copyright 2022-2026 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_TYPES_H__
25#define __YASIMAVR_TYPES_H__
26
27#include "sim_globals.h"
28#include <stdint.h>
29#include <string>
30#include <vector>
31#include <span>
32#include <climits>
33
34
36
37//cycle counts are signed to have -1 as invalid value
38//That leaves 63 bits to count cycles, which at a MCU frequency of 20MHz
39//represent more than 14000 simulated years
40typedef long long cycle_count_t;
41typedef unsigned long mem_addr_t;
42typedef unsigned long flash_addr_t;
43typedef short int_vect_t;
44
45
47
48
49//=======================================================================================
50
51typedef std::vector<uint8_t> bytes_t;
52typedef std::span<const uint8_t> bytes_view_t;
53
54
55//=======================================================================================
56
61
62public:
63
64 constexpr reg_addr_t(short addr = -1) : m_addr(addr) {}
65
66 constexpr bool valid() const { return m_addr >= 0; }
67
68 constexpr operator short() const { return m_addr; }
69
70private:
71
72 short m_addr;
73
74};
75
77
78
79#define BITSET(v, b) (((v) >> (b)) & 0x01)
80
81
82//=======================================================================================
86struct bitmask_t {
87
88 uint8_t mask;
89
90 constexpr bitmask_t(uint8_t m = 0) : mask(m) {}
91
92 constexpr uint8_t replace(uint8_t reg, uint8_t value) const
93 {
94 return (reg & ~mask) | (value & mask);
95 }
96
100 constexpr uint8_t set_from(uint8_t reg) const
101 {
102 return reg | mask;
103 }
104
108 constexpr uint8_t clear_from(uint8_t reg) const
109 {
110 return reg & ~mask;
111 }
112
113 constexpr bitmask_t operator|(const bitmask_t& bm) const { return bitmask_t(mask | bm.mask); }
114 constexpr bitmask_t operator&(const bitmask_t& bm) const { return bitmask_t(mask & bm.mask); }
115 constexpr bitmask_t operator^(const bitmask_t& bm) const { return bitmask_t(mask ^ bm.mask); }
116 constexpr bitmask_t operator~() const { return bitmask_t(~mask); }
117 inline bitmask_t& operator|=(const bitmask_t& bm) { mask |= bm.mask; return *this; }
118 inline bitmask_t& operator&=(const bitmask_t& bm) { mask &= bm.mask; return *this; }
119 inline bitmask_t& operator^=(const bitmask_t& bm) { mask ^= bm.mask; return *this; }
120
121 constexpr uint8_t operator&(uint8_t v) const { return mask & v; }
122
124 constexpr unsigned int bitcount() const
125 {
126 unsigned int n = 0;
127 uint8_t m = mask;
128 while (m) {
129 if (m & 1) n++;
130 m >>= 1;
131 }
132 return n;
133 }
134
136 constexpr bool bit(unsigned int i) const
137 {
138 return (mask >> i) & 1;
139 }
140
141};
142
143constexpr uint8_t operator|(uint8_t v, const bitmask_t& m) { return v | m.mask; }
144constexpr uint8_t operator&(uint8_t v, const bitmask_t& m) { return v & m.mask; }
145constexpr uint8_t operator^(uint8_t v, const bitmask_t& m) { return v ^ m.mask; }
146inline uint8_t& operator|=(uint8_t& v, const bitmask_t& m) { v |= m.mask; return v; }
147inline uint8_t& operator&=(uint8_t& v, const bitmask_t& m) { v &= m.mask; return v; }
148inline uint8_t& operator^=(uint8_t& v, const bitmask_t& m) { v ^= m.mask; return v; }
149
150
151//=======================================================================================
152
156struct regmask_t {
157
160
165 constexpr regmask_t operator|(const regmask_t& other) const
166 {
167 return (addr == other.addr) ? regmask_t{ addr, mask | other.mask } : regmask_t();
168 }
169
171 constexpr bool operator==(reg_addr_t a) const
172 {
173 return a == addr;
174 }
175
177 constexpr bool operator!=(reg_addr_t a) const
178 {
179 return a != addr;
180 }
181
182};
183
184constexpr bool operator==(reg_addr_t a, const regmask_t& rm)
185{
186 return rm == a;
187}
188
189constexpr bool operator!=(reg_addr_t a, const regmask_t& rm)
190{
191 return rm != a;
192}
193
194
195//=======================================================================================
196
197#ifndef __DOXYGEN__
198namespace _type_detail {
199
200class _spec_base_t {
201
202public:
203
204 constexpr _spec_base_t()
205 :m_lsb(0)
206 {}
207
208 constexpr _spec_base_t(uint8_t msb_, uint8_t lsb_)
209 :m_lsb(msb_ < lsb_ ? msb_ : lsb_)
210 {
211 uint8_t msb = lsb_ > msb_ ? lsb_ : msb_;
212 m_mask = bitmask_t((uint8_t)((1 << (msb - m_lsb + 1)) - 1) << m_lsb);
213 }
214
215 constexpr bool valid() const
216 {
217 return !!m_mask.mask;
218 }
219
220 constexpr uint8_t shift_and_mask(uint8_t value) const
221 {
222 return m_mask & (value << m_lsb);
223 }
224
225 constexpr uint8_t extract(uint8_t reg) const
226 {
227 return (m_mask & reg) >> m_lsb;
228 }
229
230 constexpr uint8_t set_from(uint8_t reg) const
231 {
232 return m_mask.set_from(reg);
233 }
234
235 constexpr uint8_t clear_from(uint8_t reg) const
236 {
237 return m_mask.clear_from(reg);
238 }
239
240 constexpr uint8_t replace(uint8_t reg, uint8_t value) const
241 {
242 return m_mask.replace(reg, value << m_lsb);
243 }
244
245 constexpr unsigned int bitcount() const
246 {
247 return m_mask.bitcount();
248 }
249
250 constexpr uint8_t lsb() const
251 {
252 return m_lsb;
253 }
254
255 constexpr uint8_t msb() const
256 {
257 return m_lsb + bitcount() - 1;
258 }
259
260 constexpr operator bitmask_t() const
261 {
262 return m_mask;
263 }
264
265 constexpr uint8_t operator&(uint8_t v) const
266 {
267 return m_mask & v;
268 }
269
270protected:
271
272 bitmask_t m_mask;
273 uint8_t m_lsb;
274
275};
276} //namespace _type_detail
277#endif //__DOXYGEN__
278
279
280//=======================================================================================
281
286#ifdef __DOXYGEN__
288#else
289class bitspec_t : public _type_detail::_spec_base_t {
290#endif
291
292public:
293
294 constexpr bitspec_t()
295 :_spec_base_t()
296 {}
297
298 constexpr bitspec_t(uint8_t msb_, uint8_t lsb_)
299 :_spec_base_t(msb_, lsb_)
300 {}
301
302 constexpr explicit bitspec_t(uint8_t bit)
303 :_spec_base_t(bit, bit)
304 {}
305
306 constexpr bitspec_t(const _spec_base_t& spec)
307 :_spec_base_t(spec)
308 {}
309
310 constexpr bitspec_t bit(uint8_t n) const
311 {
312 if (n < bitcount())
313 return bitspec_t(m_lsb + n);
314 else
315 return bitspec_t();
316 }
317
318 constexpr bitmask_t operator|(const bitspec_t& other) const
319 {
320 return m_mask | other.m_mask;
321 }
322
323#ifdef __DOXYGEN__
325 constexpr bool valid() const;
327 constexpr uint8_t shift_and_mask(uint8_t value) const;
329 constexpr uint8_t extract(uint8_t reg) const;
330 constexpr uint8_t set_from(uint8_t reg) const;
331 constexpr uint8_t clear_from(uint8_t reg) const;
332 constexpr uint8_t replace(uint8_t reg, uint8_t value) const;
333 constexpr unsigned int bitcount() const;
334 constexpr uint8_t lsb() const;
335 constexpr uint8_t msb() const;
336 constexpr operator bitmask_t() const;
337 constexpr uint8_t operator&(uint8_t v) const;
338#endif
339};
340
341
342//=======================================================================================
343
347#ifdef __DOXYGEN__
348class regbit_t {
349#else
350class regbit_t : public _type_detail::_spec_base_t {
351#endif
352
353public:
354
356
357 constexpr regbit_t()
358 :_spec_base_t()
359 {}
360
361 constexpr explicit regbit_t(reg_addr_t a)
362 :_spec_base_t(7, 0)
363 ,addr(a)
364 {}
365
366 constexpr regbit_t(reg_addr_t a, uint8_t bit)
367 :_spec_base_t(bit, bit)
368 ,addr(a)
369 {}
370
371 constexpr regbit_t(reg_addr_t a, uint8_t msb_, uint8_t lsb_)
372 :_spec_base_t(msb_, lsb_)
373 ,addr(a)
374 {}
375
376 constexpr regbit_t(reg_addr_t a, const bitspec_t& f)
377 :_spec_base_t(f)
378 ,addr(a)
379 {}
380
381 constexpr regbit_t bit(uint8_t n) const
382 {
383 if (n < bitcount())
384 return regbit_t(addr, m_lsb + n);
385 else
386 return regbit_t();
387 }
388
389 constexpr operator regmask_t() const
390 {
391 return { addr, m_mask };
392 }
393
394 constexpr bool operator==(reg_addr_t a) const
395 {
396 return a == addr;
397 }
398
399 constexpr bool operator!=(reg_addr_t a) const
400 {
401 return a != addr;
402 }
403
404#ifdef __DOXYGEN__
406 constexpr bool valid() const;
408 constexpr uint8_t shift_and_mask(uint8_t value) const;
410 constexpr uint8_t extract(uint8_t reg) const;
411 constexpr uint8_t set_from(uint8_t reg) const;
412 constexpr uint8_t clear_from(uint8_t reg) const;
413 constexpr uint8_t replace(uint8_t reg, uint8_t value) const;
414 constexpr unsigned int bitcount() const;
415 constexpr uint8_t lsb() const;
416 constexpr uint8_t msb() const;
417 constexpr operator bitmask_t() const;
418 constexpr uint8_t operator&(uint8_t v) const;
419#endif
420
421};
422
423
424//=======================================================================================
425
432
433public:
434
435 constexpr regbit_compound_t() = default;
436
437 constexpr explicit regbit_compound_t(const regbit_t& rb)
438 :m_regbits({rb})
439 {}
440
441 constexpr explicit regbit_compound_t(const std::vector<regbit_t>& v)
442 :m_regbits(v)
443 {}
444
445 constexpr regbit_compound_t(const regbit_compound_t&) = default;
446
448 constexpr std::vector<regbit_t>::const_iterator begin() const
449 {
450 return m_regbits.begin();
451 }
452
454 constexpr std::vector<regbit_t>::const_iterator end() const
455 {
456 return m_regbits.end();
457 }
458
460 constexpr size_t size() const
461 {
462 return m_regbits.size();
463 }
464
466 constexpr const regbit_t& operator[](size_t index) const
467 {
468 return m_regbits[index];
469 }
470
472 bool addr_match(reg_addr_t addr) const;
473
475 unsigned int bitcount() const;
476
478 regbit_compound_t& operator=(const std::vector<regbit_t>& v);
479
482
483private:
484
485 std::vector<regbit_t> m_regbits;
486
487};
488
489
490//=======================================================================================
491
496
497public:
498
499 typedef std::exception bad_type;
500
509
510 constexpr vardata_t() : t(Invalid), i(0) {}
511
512 template<typename T>
513 constexpr vardata_t(T* p_) : t(Pointer), p(const_cast<std::remove_cv_t<T>*>(p_)) {}
514
515 constexpr vardata_t(double d_) : t(Double), d(d_) {}
516
517 constexpr vardata_t(unsigned char u_) : vardata_t((unsigned long long) u_) {}
518 constexpr vardata_t(unsigned short u_) : vardata_t((unsigned long long) u_) {}
519 constexpr vardata_t(unsigned int u_) : vardata_t((unsigned long long) u_) {}
520 constexpr vardata_t(unsigned long u_) : vardata_t((unsigned long long) u_) {}
521 constexpr vardata_t(unsigned long long u_) : t(Uinteger), u(u_) {}
522
523 constexpr vardata_t(signed char i_) : vardata_t((long long) i_) {}
524 constexpr vardata_t(short i_) : vardata_t((long long) i_) {}
525 constexpr vardata_t(int i_) : vardata_t((long long) i_) {}
526 constexpr vardata_t(long i_) : vardata_t((long long) i_) {}
527 constexpr vardata_t(long long i_) : t(Integer), i(i_) {}
528
529 constexpr vardata_t(const bytes_view_t& b_) : t(Bytes), b(b_) {}
530
531 constexpr vardata_t(const vardata_t&) = default;
532 constexpr vardata_t(vardata_t&&) = default;
533
534 constexpr Type type() const { return t; }
535
536 template<typename T>
537 constexpr T* as_ptr() const
538 {
539 if (t != Pointer)
540 throw bad_type();
541 return reinterpret_cast<T*>(p);
542 }
543
544 constexpr double as_double() const
545 {
546 if (t == Double)
547 return d;
548 else if (t == Uinteger)
549 return u;
550 else if (t == Integer)
551 return i;
552 else
553 throw bad_type();
554 }
555
556 constexpr unsigned long long as_uint() const
557 {
558 if (t == Uinteger)
559 return u;
560 else if (t == Integer && i >= 0)
561 return i;
562 throw bad_type();
563 }
564
565 constexpr long long as_int() const
566 {
567 if (t == Integer)
568 return i;
569 else if (t == Uinteger && u <= LLONG_MAX)
570 return u;
571 throw bad_type();
572 }
573
574 constexpr bytes_view_t as_bytes() const
575 {
576 if (t != Bytes)
577 throw bad_type();
578 return b;
579 }
580
581 template<typename T>
582 constexpr vardata_t& operator=(T* p_) { return (*this = vardata_t(p_)); }
583
584 constexpr vardata_t& operator=(double d_) { return (*this = vardata_t(d_)); }
585
586 constexpr vardata_t& operator=(unsigned char u_) { return (*this = (unsigned long long) u_); }
587 constexpr vardata_t& operator=(unsigned short u_) { return (*this = (unsigned long long) u_); }
588 constexpr vardata_t& operator=(unsigned int u_) { return (*this = (unsigned long long) u_); }
589 constexpr vardata_t& operator=(unsigned long u_) { return (*this = (unsigned long long) u_); }
590 constexpr vardata_t& operator=(unsigned long long u_) { return (*this = vardata_t(u_)); }
591
592 constexpr vardata_t& operator=(signed char i_) { return (*this = (long long) i_); }
593 constexpr vardata_t& operator=(short i_) { return (*this = (long long) i_); }
594 constexpr vardata_t& operator=(int i_) { return (*this = (long long) i_); }
595 constexpr vardata_t& operator=(long i_) { return (*this = (long long) i_); }
596 constexpr vardata_t& operator=(long long i_) { return (*this = vardata_t(i_)); }
597
598 constexpr vardata_t& operator=(const bytes_view_t& b_) { return (*this = vardata_t(b_)); }
599
600 constexpr vardata_t& operator=(const vardata_t&) = default;
601 constexpr vardata_t& operator=(vardata_t&&) = default;
602
603 bool operator==(const vardata_t& other) const;
604 inline bool operator!=(const vardata_t& other) const { return !(*this == other); }
605
606private:
607
608 Type t;
609
610 union {
611 void* p;
612 double d;
613 long long i;
614 unsigned long long u;
616 };
617
618};
619
620
621//=======================================================================================
622
628
629public:
630
631 constexpr sim_id_t() : m_id(0) {}
632 constexpr explicit sim_id_t(uint64_t id) : m_id(id) {}
633 constexpr sim_id_t(const char* s) : m_id(strtoid(s)) {}
634 constexpr sim_id_t(const std::string& s) : m_id(strtoid(s.c_str())) {}
635 constexpr sim_id_t(const sim_id_t&) = default;
636
637 constexpr sim_id_t& operator=(uint64_t id) { m_id = id; return *this; }
638 constexpr sim_id_t& operator=(const char* s) { m_id = strtoid(s); return *this; }
639 constexpr sim_id_t& operator=(const std::string& s) { m_id = strtoid(s.c_str()); return *this; }
640 constexpr sim_id_t& operator=(const sim_id_t&) = default;
641
642 constexpr operator vardata_t() const { return vardata_t(m_id); }
643
644 std::string str() const;
645
646 constexpr bool operator==(const sim_id_t& other) const { return m_id == other.m_id; }
647
648 constexpr operator bool() const { return !!m_id; }
649
650 constexpr sim_id_t operator+(char c) const { return sim_id_t((m_id << 8) | c); }
651 constexpr sim_id_t& operator+=(char c) { m_id = (m_id << 8) | c; return *this; }
652
653private:
654
655 friend struct std::hash<sim_id_t>;
656
657 uint64_t m_id;
658
659 static constexpr uint64_t strtoid(const char* s)
660 {
661 uint64_t id = 0;
662 int n = 0;
663 while (n++ < 8 && *s)
664 id = (id << 8) | *s++;
665 return id;
666 }
667
668};
669
671
672std::ostream& operator<<(std::ostream& o, const sim_id_t& id);
673
674
676
677#ifndef __DOXYGEN__
678template<>
679struct std::hash<YASIMAVR_QUALIFIED_NAME(sim_id_t)>
680{
681 constexpr std::size_t operator()(const YASIMAVR_QUALIFIED_NAME(sim_id_t)& sid) const noexcept
682 {
683 return sid.m_id;
684 }
685};
686#endif
687
688#endif //__YASIMAVR_TYPES_H__
bit spec structure. Represent a field in a I/O register. It works the same as bitmask_t except used b...
Definition sim_types.h:287
constexpr uint8_t operator&(uint8_t v) const
constexpr uint8_t shift_and_mask(uint8_t value) const
Transform the field value to its true representation and position in the 8-bits of the register.
constexpr uint8_t msb() const
constexpr uint8_t extract(uint8_t reg) const
Extract the field value and shift right by the LSB.
constexpr bitspec_t(const _spec_base_t &spec)
Definition sim_types.h:306
constexpr bitspec_t(uint8_t msb_, uint8_t lsb_)
Definition sim_types.h:298
constexpr uint8_t clear_from(uint8_t reg) const
constexpr bitspec_t()
Definition sim_types.h:294
constexpr bitmask_t operator|(const bitspec_t &other) const
Definition sim_types.h:318
constexpr uint8_t set_from(uint8_t reg) const
constexpr bitspec_t(uint8_t bit)
Definition sim_types.h:302
constexpr bitspec_t bit(uint8_t n) const
Definition sim_types.h:310
constexpr uint8_t lsb() const
constexpr uint8_t replace(uint8_t reg, uint8_t value) const
constexpr bool valid() const
Returns true if at least one bit set.
constexpr unsigned int bitcount() const
Representation of a I/O register address, with validity state.
Definition sim_types.h:60
constexpr reg_addr_t(short addr=-1)
Definition sim_types.h:64
constexpr bool valid() const
Definition sim_types.h:66
Definition sim_types.h:431
constexpr regbit_compound_t(const regbit_t &rb)
Definition sim_types.h:437
constexpr regbit_compound_t(const regbit_compound_t &)=default
constexpr std::vector< regbit_t >::const_iterator begin() const
Returns a iterator to the beginning of the regbit pieces.
Definition sim_types.h:448
constexpr const regbit_t & operator[](size_t index) const
Returns a reference to the specified regbit.
Definition sim_types.h:466
constexpr size_t size() const
Returns the number of pieces.
Definition sim_types.h:460
constexpr regbit_compound_t()=default
constexpr regbit_compound_t(const std::vector< regbit_t > &v)
Definition sim_types.h:441
constexpr std::vector< regbit_t >::const_iterator end() const
Returns a iterator to the end of the regbit pieces.
Definition sim_types.h:454
regbit_compound_t & operator=(const regbit_compound_t &)=default
Assigns the compound.
Represents a field in a I/O register with address.
Definition sim_types.h:348
reg_addr_t addr
Definition sim_types.h:355
constexpr regbit_t()
Definition sim_types.h:357
constexpr uint8_t msb() const
constexpr unsigned int bitcount() const
constexpr uint8_t replace(uint8_t reg, uint8_t value) const
constexpr uint8_t extract(uint8_t reg) const
Extract the field value and shift right by the LSB.
constexpr regbit_t(reg_addr_t a, const bitspec_t &f)
Definition sim_types.h:376
constexpr uint8_t lsb() const
constexpr bool operator!=(reg_addr_t a) const
Definition sim_types.h:399
constexpr regbit_t bit(uint8_t n) const
Definition sim_types.h:381
constexpr bool valid() const
Returns true if at least one bit set.
constexpr uint8_t set_from(uint8_t reg) const
constexpr uint8_t clear_from(uint8_t reg) const
constexpr bool operator==(reg_addr_t a) const
Definition sim_types.h:394
constexpr uint8_t shift_and_mask(uint8_t value) const
Transform the field value to its true representation and position in the 8-bits of the register.
constexpr uint8_t operator&(uint8_t v) const
constexpr regbit_t(reg_addr_t a, uint8_t bit)
Definition sim_types.h:366
constexpr regbit_t(reg_addr_t a)
Definition sim_types.h:361
constexpr regbit_t(reg_addr_t a, uint8_t msb_, uint8_t lsb_)
Definition sim_types.h:371
Representation of a ID internally represented as a 64-bits integer but can be initialised with a stri...
Definition sim_types.h:627
constexpr sim_id_t & operator=(uint64_t id)
Definition sim_types.h:637
constexpr sim_id_t(const char *s)
Definition sim_types.h:633
constexpr sim_id_t(const sim_id_t &)=default
constexpr sim_id_t operator+(char c) const
Definition sim_types.h:650
constexpr sim_id_t & operator=(const sim_id_t &)=default
constexpr sim_id_t & operator=(const char *s)
Definition sim_types.h:638
constexpr sim_id_t(uint64_t id)
Definition sim_types.h:632
constexpr sim_id_t & operator=(const std::string &s)
Definition sim_types.h:639
constexpr sim_id_t & operator+=(char c)
Definition sim_types.h:651
constexpr sim_id_t()
Definition sim_types.h:631
constexpr bool operator==(const sim_id_t &other) const
Definition sim_types.h:646
constexpr sim_id_t(const std::string &s)
Definition sim_types.h:634
Definition sim_types.h:495
constexpr vardata_t(const bytes_view_t &b_)
Definition sim_types.h:529
constexpr vardata_t & operator=(double d_)
Definition sim_types.h:584
constexpr vardata_t(T *p_)
Definition sim_types.h:513
constexpr vardata_t & operator=(int i_)
Definition sim_types.h:594
constexpr vardata_t(long i_)
Definition sim_types.h:526
constexpr vardata_t & operator=(unsigned char u_)
Definition sim_types.h:586
bytes_view_t b
Definition sim_types.h:615
constexpr vardata_t(short i_)
Definition sim_types.h:524
constexpr vardata_t(double d_)
Definition sim_types.h:515
constexpr vardata_t(unsigned long u_)
Definition sim_types.h:520
std::exception bad_type
Definition sim_types.h:499
constexpr unsigned long long as_uint() const
Definition sim_types.h:556
constexpr vardata_t(int i_)
Definition sim_types.h:525
bool operator!=(const vardata_t &other) const
Definition sim_types.h:604
constexpr vardata_t & operator=(short i_)
Definition sim_types.h:593
constexpr long long as_int() const
Definition sim_types.h:565
constexpr T * as_ptr() const
Definition sim_types.h:537
constexpr vardata_t & operator=(vardata_t &&)=default
void * p
Definition sim_types.h:611
constexpr vardata_t & operator=(unsigned short u_)
Definition sim_types.h:587
constexpr vardata_t(const vardata_t &)=default
unsigned long long u
Definition sim_types.h:614
constexpr vardata_t(unsigned char u_)
Definition sim_types.h:517
Type
Definition sim_types.h:501
@ Invalid
Definition sim_types.h:502
@ Integer
Definition sim_types.h:506
@ Pointer
Definition sim_types.h:503
@ Uinteger
Definition sim_types.h:505
@ Double
Definition sim_types.h:504
long long i
Definition sim_types.h:613
constexpr vardata_t(long long i_)
Definition sim_types.h:527
constexpr vardata_t & operator=(const vardata_t &)=default
constexpr vardata_t(vardata_t &&)=default
constexpr vardata_t(unsigned long long u_)
Definition sim_types.h:521
constexpr vardata_t & operator=(unsigned long u_)
Definition sim_types.h:589
double d
Definition sim_types.h:612
constexpr Type type() const
Definition sim_types.h:534
constexpr vardata_t & operator=(unsigned long long u_)
Definition sim_types.h:590
constexpr vardata_t & operator=(long long i_)
Definition sim_types.h:596
constexpr bytes_view_t as_bytes() const
Definition sim_types.h:574
constexpr vardata_t & operator=(T *p_)
Definition sim_types.h:582
constexpr vardata_t(unsigned int u_)
Definition sim_types.h:519
constexpr vardata_t(signed char i_)
Definition sim_types.h:523
constexpr vardata_t(unsigned short u_)
Definition sim_types.h:518
constexpr vardata_t & operator=(const bytes_view_t &b_)
Definition sim_types.h:598
constexpr vardata_t & operator=(long i_)
Definition sim_types.h:595
constexpr vardata_t & operator=(signed char i_)
Definition sim_types.h:592
constexpr double as_double() const
Definition sim_types.h:544
constexpr vardata_t & operator=(unsigned int u_)
Definition sim_types.h:588
constexpr vardata_t()
Definition sim_types.h:510
#define YASIMAVR_BEGIN_NAMESPACE
Definition sim_globals.h:58
#define AVR_CORE_PUBLIC_API
Definition sim_globals.h:46
#define YASIMAVR_QUALIFIED_NAME(name)
Definition sim_globals.h:61
#define YASIMAVR_END_NAMESPACE
Definition sim_globals.h:59
std::ostream & operator<<(std::ostream &o, const sim_id_t &id)
Definition sim_types.cpp:102
constexpr bool operator!=(reg_addr_t a, const regmask_t &rm)
Definition sim_types.h:189
std::vector< uint8_t > bytes_t
Definition sim_types.h:51
unsigned long flash_addr_t
Definition sim_types.h:42
constexpr uint8_t operator^(uint8_t v, const bitmask_t &m)
Definition sim_types.h:145
uint8_t & operator|=(uint8_t &v, const bitmask_t &m)
Definition sim_types.h:146
const cycle_count_t INVALID_CYCLE
Definition sim_types.h:46
uint8_t & operator&=(uint8_t &v, const bitmask_t &m)
Definition sim_types.h:147
sim_id_t ctl_id_t
Definition sim_types.h:670
constexpr bool operator==(reg_addr_t a, const regmask_t &rm)
Definition sim_types.h:184
unsigned long mem_addr_t
Definition sim_types.h:41
std::span< const uint8_t > bytes_view_t
Definition sim_types.h:52
constexpr reg_addr_t INVALID_REGISTER
Definition sim_types.h:76
constexpr uint8_t operator&(uint8_t v, const bitmask_t &m)
Definition sim_types.h:144
constexpr uint8_t operator|(uint8_t v, const bitmask_t &m)
Definition sim_types.h:143
uint8_t & operator^=(uint8_t &v, const bitmask_t &m)
Definition sim_types.h:148
short int_vect_t
Definition sim_types.h:43
YASIMAVR_BEGIN_NAMESPACE typedef long long cycle_count_t
Definition sim_types.h:40
Bit mask structure for bitwise operations on 8-bits registers.
Definition sim_types.h:86
constexpr bitmask_t(uint8_t m=0)
Definition sim_types.h:90
constexpr uint8_t operator&(uint8_t v) const
Definition sim_types.h:121
constexpr bool bit(unsigned int i) const
Returns the state of the bit i.
Definition sim_types.h:136
constexpr unsigned int bitcount() const
Returns the number of bits set in the mask.
Definition sim_types.h:124
constexpr bitmask_t operator|(const bitmask_t &bm) const
Definition sim_types.h:113
constexpr uint8_t clear_from(uint8_t reg) const
Definition sim_types.h:108
bitmask_t & operator^=(const bitmask_t &bm)
Definition sim_types.h:119
constexpr bitmask_t operator~() const
Definition sim_types.h:116
bitmask_t & operator&=(const bitmask_t &bm)
Definition sim_types.h:118
constexpr uint8_t replace(uint8_t reg, uint8_t value) const
Definition sim_types.h:92
bitmask_t & operator|=(const bitmask_t &bm)
Definition sim_types.h:117
constexpr uint8_t set_from(uint8_t reg) const
Definition sim_types.h:100
constexpr bitmask_t operator^(const bitmask_t &bm) const
Definition sim_types.h:115
uint8_t mask
Definition sim_types.h:88
constexpr bitmask_t operator&(const bitmask_t &bm) const
Definition sim_types.h:114
Address + bit mask structure.
Definition sim_types.h:156
constexpr regmask_t operator|(const regmask_t &other) const
Definition sim_types.h:165
constexpr bool operator==(reg_addr_t a) const
Returns true if the regmask_t objects have the same address.
Definition sim_types.h:171
bitmask_t mask
Definition sim_types.h:159
reg_addr_t addr
Definition sim_types.h:158
constexpr bool operator!=(reg_addr_t a) const
Returns true if the regmask_t objects have a different address.
Definition sim_types.h:177