24#ifndef __YASIMAVR_TYPES_H__
25#define __YASIMAVR_TYPES_H__
66 constexpr bool valid()
const {
return m_addr >= 0; }
68 constexpr operator short()
const {
return m_addr; }
79#define BITSET(v, b) (((v) >> (b)) & 0x01)
92 constexpr uint8_t
replace(uint8_t reg, uint8_t value)
const
94 return (reg & ~
mask) | (value &
mask);
136 constexpr bool bit(
unsigned int i)
const
138 return (
mask >> i) & 1;
198namespace _type_detail {
204 constexpr _spec_base_t()
208 constexpr _spec_base_t(uint8_t msb_, uint8_t lsb_)
209 :m_lsb(msb_ < lsb_ ? msb_ : lsb_)
211 uint8_t msb = lsb_ > msb_ ? lsb_ : msb_;
212 m_mask =
bitmask_t((uint8_t)((1 << (msb - m_lsb + 1)) - 1) << m_lsb);
215 constexpr bool valid()
const
217 return !!m_mask.mask;
220 constexpr uint8_t shift_and_mask(uint8_t value)
const
222 return m_mask & (value << m_lsb);
225 constexpr uint8_t extract(uint8_t reg)
const
227 return (m_mask & reg) >> m_lsb;
230 constexpr uint8_t set_from(uint8_t reg)
const
232 return m_mask.set_from(reg);
235 constexpr uint8_t clear_from(uint8_t reg)
const
237 return m_mask.clear_from(reg);
240 constexpr uint8_t replace(uint8_t reg, uint8_t value)
const
242 return m_mask.replace(reg, value << m_lsb);
245 constexpr unsigned int bitcount()
const
247 return m_mask.bitcount();
250 constexpr uint8_t lsb()
const
255 constexpr uint8_t msb()
const
257 return m_lsb + bitcount() - 1;
265 constexpr uint8_t
operator&(uint8_t v)
const
289class bitspec_t :
public _type_detail::_spec_base_t {
299 :_spec_base_t(msb_, lsb_)
320 return m_mask | other.m_mask;
332 constexpr uint8_t
replace(uint8_t reg, uint8_t value)
const;
334 constexpr uint8_t
lsb()
const;
335 constexpr uint8_t
msb()
const;
350class regbit_t :
public _type_detail::_spec_base_t {
367 :_spec_base_t(bit, bit)
372 :_spec_base_t(msb_, lsb_)
391 return { addr, m_mask };
413 constexpr uint8_t
replace(uint8_t reg, uint8_t value)
const;
415 constexpr uint8_t
lsb()
const;
416 constexpr uint8_t
msb()
const;
448 constexpr std::vector<regbit_t>::const_iterator
begin()
const
450 return m_regbits.begin();
454 constexpr std::vector<regbit_t>::const_iterator
end()
const
456 return m_regbits.end();
462 return m_regbits.size();
468 return m_regbits[index];
475 unsigned int bitcount()
const;
485 std::vector<regbit_t> m_regbits;
513 constexpr vardata_t(T* p_) : t(Pointer), p(const_cast<std::remove_cv_t<T>*>(p_)) {}
521 constexpr vardata_t(
unsigned long long u_) : t(Uinteger), u(u_) {}
527 constexpr vardata_t(
long long i_) : t(Integer), i(i_) {}
541 return reinterpret_cast<T*
>(p);
548 else if (t == Uinteger)
550 else if (t == Integer)
560 else if (t == Integer && i >= 0)
569 else if (t == Uinteger && u <= LLONG_MAX)
614 unsigned long long u;
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())) {}
639 constexpr sim_id_t&
operator=(
const std::string& s) { m_id = strtoid(s.c_str());
return *
this; }
644 std::string str()
const;
648 constexpr operator bool()
const {
return !!m_id; }
659 static constexpr uint64_t strtoid(
const char* s)
663 while (n++ < 8 && *s)
664 id = (
id << 8) | *s++;
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