bring in new version of sv_reg.h
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 19 Oct 2018 08:35:12 +0000 (09:35 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 19 Oct 2018 08:35:12 +0000 (09:35 +0100)
riscv/sv_reg.h

index 6a69f28535bc3115a77e92d9c685e6b73e0a5fdf..a1a6dbf9aded5de3fb59efed39b412a09fbbaa93 100644 (file)
 #ifndef SV_REG_H
 #define SV_REG_H
 
-#include <stdio.h>
-#include "decode.h"
-
-#define DECL_1OP( op ) \
-  bool operator op () const { \
-    return op (this->as_uint64()); }
-
-#define DECL_BOP( op ) \
-  bool operator op (const sv_reg_t& rhs) const { \
-    return this->as_uint64() op rhs.as_uint64(); } \
-  bool operator op (reg_t rhs) const { \
-    return this->as_uint64() op rhs; }
-
-#define DECL_BOPE( op ) \
-  bool operator op (int rhs) const { \
-    return this->as_uint64() op ((unsigned int)rhs); } \
-  bool operator op (long int rhs) const { \
-    return this->as_uint64() op ((unsigned long int)rhs); }
-
-#define DECL_OP( type, op ) \
-  sv_reg_t operator op (const sv_reg_t& rhs) const { \
-    return make_##type( (this->as_uint64() op rhs.as_uint64()) ); } \
-  sv_reg_t operator op (const reg_t& rhs) const { \
-    return make_##type( (this->as_uint64() op rhs) ); } \
-  sv_reg_t operator op (const sreg_t& rhs) const { \
-    return make_##type( (this->as_uint64() op rhs) ); } \
-  sv_reg_t operator op (int rhs) const { \
-    return make_##type( (this->as_uint64() op rhs) ); } \
-  sv_reg_t operator op (uint32_t rhs) const { \
-    return make_##type( (this->as_uint64() op rhs) ); }
-
-#define op_bneg ~
-#define op_xor ^
-#define op_or |
-#define op_and &
-#define op_plus +
-#define op_minus -
-#define op_div /
-#define op_rem %
-#define op_mul *
-#define op_gt >
-#define op_ge >=
-#define op_lt <
-#define op_le <=
-#define op_eq ==
-#define op_ne !=
-#define op_sl <<
-#define op_sr >>
-
-class sv_uint64_t;
-class sv_sreg_t;
-
 class sv_reg_t {
 public:
-  virtual ~sv_reg_t() {}
-  // using a type which accommodates all values
-  virtual uint64_t as_uint64() const = 0;
+    sv_reg_t(uint64_t _reg) : reg(_reg), elwidth(0) {} // default elwidth
+    sv_reg_t(uint64_t _reg, uint8_t _elwidth) : reg(_reg), elwidth(_elwidth) {}
 
+    uint64_t reg;
+    uint8_t elwidth;
 public:
-  DECL_BOP( op_ge )
-  DECL_BOP( op_gt )
-  DECL_BOP( op_eq )
-  DECL_BOPE( op_eq )
-  DECL_BOP( op_ne )
-  DECL_BOPE( op_ne )
-  DECL_BOP( op_le )
-  DECL_BOP( op_lt )
-  DECL_1OP( op_bneg )
-  DECL_OP( sv_uint64_t, op_or )
-  DECL_OP( sv_uint64_t, op_xor )
-  DECL_OP( sv_uint64_t, op_and )
-  DECL_OP( sv_uint64_t, op_plus )
-  DECL_OP( sv_uint64_t, op_minus )
-  DECL_OP( sv_uint64_t, op_div )
-  DECL_OP( sv_uint64_t, op_rem )
-  DECL_OP( sv_uint64_t, op_mul )
-  DECL_OP( sv_uint64_t, op_sl )
-  DECL_OP( sv_uint64_t, op_sr )
-
-  operator uint8_t ();
-  operator char ();
-  operator uint32_t ();
-  operator int32_t ();
-  operator uint16_t ();
-  operator sv_sreg_t () ;
-  operator sreg_t () ;
-  operator reg_t () ;
-  //operator uint_fast64_t () const
-  //      { return make_sv_uint64_t( (reg_t) (as_uint64()) ); }
-  //operator int_fast64_t () const
-        //{ return make_sv_int64_t( (sreg_t) (as_uint64()) ); }
-  // ...
-public:
-  uint64_t get_data() { return as_uint64(); }
-  sv_reg_t make_sv_uint64_t (uint64_t v) const;
-  sv_reg_t make_sv_int64_t (int64_t v) const;
-};
-
-class sv_sreg_t : public sv_reg_t {
-public:
-    sv_sreg_t(int64_t v) : data(v) {}
-// ...
-private:
-    virtual uint64_t as_uint64() const { return this->data; }
-private:
-    int64_t data;
+  uint64_t get_data() { return reg; }
+  uint8_t get_width() { return elwidth; }
 };
 
-class sv_uint64_t : public sv_reg_t {
+class sv_sreg_t {
 public:
-    sv_uint64_t(uint64_t v) : data(v) {}
-// ...
-private:
-    virtual uint64_t as_uint64() const { return this->data; }
-private:
-    uint64_t data;
-};
+    sv_sreg_t(int64_t _reg) : reg(_reg), elwidth(0) {} // default elwidth
+    sv_sreg_t(int64_t _reg, uint8_t _elwidth) : reg(_reg), elwidth(_elwidth) {}
 
-class sv_uint16_t : public sv_reg_t {
-// ...
+    int64_t reg;
+    uint8_t elwidth;
 public:
-    sv_uint16_t(uint16_t v) : data(v) {}
-private:
-    virtual uint64_t as_uint64() const { return this->data; }
-private:
-    uint16_t data;
+  int64_t get_data() { return reg; }
+  uint8_t get_width() { return elwidth; }
 };