You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
3.0 KiB
170 lines
3.0 KiB
// See LICENSE for license details.
|
|
#ifndef _RISCV_ISA_PARSER_H
|
|
#define _RISCV_ISA_PARSER_H
|
|
|
|
#include "decode.h"
|
|
|
|
#include <bitset>
|
|
#include <string>
|
|
#include <set>
|
|
|
|
typedef enum {
|
|
// 65('A') ~ 90('Z') is reserved for standard isa in misa
|
|
EXT_ZFH = 'Z' + 1,
|
|
EXT_ZFHMIN,
|
|
EXT_ZBA,
|
|
EXT_ZBB,
|
|
EXT_ZBC,
|
|
EXT_ZBS,
|
|
EXT_ZBKB,
|
|
EXT_ZBKC,
|
|
EXT_ZBKX,
|
|
EXT_ZCA,
|
|
EXT_ZCB,
|
|
EXT_ZCD,
|
|
EXT_ZCE,
|
|
EXT_ZCF,
|
|
EXT_ZCLSD,
|
|
EXT_ZCMP,
|
|
EXT_ZCMT,
|
|
EXT_ZKND,
|
|
EXT_ZKNE,
|
|
EXT_ZKNH,
|
|
EXT_ZKSED,
|
|
EXT_ZKSH,
|
|
EXT_ZKR,
|
|
EXT_ZMMUL,
|
|
EXT_ZVFH,
|
|
EXT_ZVFBFA,
|
|
EXT_ZVFHMIN,
|
|
EXT_ZVFOFP4MIN,
|
|
EXT_ZVFOFP8MIN,
|
|
EXT_SMEPMP,
|
|
EXT_SMPMPMT,
|
|
EXT_SMRNMI,
|
|
EXT_SMSTATEEN,
|
|
EXT_SSPMP,
|
|
EXT_SMPMPDELEG,
|
|
EXT_SSPMPEN,
|
|
EXT_SSCOFPMF,
|
|
EXT_SVADU,
|
|
EXT_SVADE,
|
|
EXT_SVNAPOT,
|
|
EXT_SVPBMT,
|
|
EXT_SVINVAL,
|
|
EXT_SVUKTE,
|
|
EXT_SVRSW60T59B,
|
|
EXT_ZDINX,
|
|
EXT_ZFA,
|
|
EXT_ZFBFMIN,
|
|
EXT_ZFINX,
|
|
EXT_ZHINX,
|
|
EXT_ZHINXMIN,
|
|
EXT_ZIBI,
|
|
EXT_ZICCID,
|
|
EXT_ZICBOM,
|
|
EXT_ZICBOZ,
|
|
EXT_ZICCLSM,
|
|
EXT_ZICNTR,
|
|
EXT_ZICOND,
|
|
EXT_ZIHPM,
|
|
EXT_ZILSD,
|
|
EXT_ZVABD,
|
|
EXT_ZVBB,
|
|
EXT_ZVKB,
|
|
EXT_ZVBC,
|
|
EXT_ZVFBFMIN,
|
|
EXT_ZVFBFWMA,
|
|
EXT_ZVKG,
|
|
EXT_ZVKNED,
|
|
EXT_ZVKNHA,
|
|
EXT_ZVKNHB,
|
|
EXT_ZVKSED,
|
|
EXT_ZVKSH,
|
|
EXT_ZVDOT4A,
|
|
EXT_ZVQWBDOTA8I,
|
|
EXT_ZVQWBDOTA16I,
|
|
EXT_ZVFQWBDOTA8F,
|
|
EXT_ZVFWBDOTA16BF,
|
|
EXT_ZVFBDOTA32F,
|
|
EXT_ZVQWDOTA8I,
|
|
EXT_ZVQWDOTA16I,
|
|
EXT_ZVFQWDOTA8F,
|
|
EXT_ZVFWDOTA16BF,
|
|
EXT_ZVZIP,
|
|
EXT_SSTC,
|
|
EXT_ZAAMO,
|
|
EXT_ZALRSC,
|
|
EXT_ZACAS,
|
|
EXT_ZABHA,
|
|
EXT_ZAWRS,
|
|
EXT_ZAMA16B,
|
|
EXT_INTERNAL_ZFH_MOVE,
|
|
EXT_SMCSRIND,
|
|
EXT_SSCSRIND,
|
|
EXT_SMCDELEG,
|
|
EXT_SSCCFG,
|
|
EXT_SMCNTRPMF,
|
|
EXT_ZIMOP,
|
|
EXT_ZCMOP,
|
|
EXT_ZALASR,
|
|
EXT_SSQOSID,
|
|
EXT_ZICFILP,
|
|
EXT_ZICFISS,
|
|
EXT_SSDBLTRP,
|
|
EXT_SMDBLTRP,
|
|
EXT_SMMPM,
|
|
EXT_SMNPM,
|
|
EXT_SSNPM,
|
|
EXT_SMAIA,
|
|
EXT_SSAIA,
|
|
EXT_ZA64RS,
|
|
EXT_ZA128RS,
|
|
NUM_ISA_EXTENSIONS
|
|
} isa_extension_t;
|
|
|
|
typedef enum {
|
|
IMPL_MMU_VMID,
|
|
IMPL_MMU_ASID,
|
|
} impl_extension_t;
|
|
|
|
class isa_parser_t {
|
|
public:
|
|
isa_parser_t(const char* str, const char *priv);
|
|
~isa_parser_t() {};
|
|
unsigned get_max_xlen() const { return max_xlen; }
|
|
reg_t get_max_isa() const { return max_isa; }
|
|
std::string get_isa_string() const { return isa_string; }
|
|
reg_t get_vlen() const { return vlen; }
|
|
reg_t get_elen() const { return elen; }
|
|
bool get_zvf() const { return zvf; }
|
|
bool get_zvd() const { return zvd; }
|
|
bool extension_enabled(unsigned char ext) const {
|
|
return extension_enabled(isa_extension_t(ext));
|
|
}
|
|
bool extension_enabled(isa_extension_t ext) const {
|
|
return extension_table[ext];
|
|
}
|
|
bool has_any_vector() const { return vlen > 0; }
|
|
|
|
std::bitset<NUM_ISA_EXTENSIONS> get_extension_table() const { return extension_table; }
|
|
|
|
const std::set<std::string> &get_extensions() const { return extensions; }
|
|
|
|
protected:
|
|
unsigned max_xlen;
|
|
reg_t max_isa;
|
|
reg_t vlen;
|
|
reg_t elen;
|
|
bool zvf;
|
|
bool zvd;
|
|
std::bitset<NUM_ISA_EXTENSIONS> extension_table;
|
|
std::string isa_string;
|
|
std::set<std::string> extensions;
|
|
|
|
private:
|
|
void add_extension(const std::string&, const char*);
|
|
void apply_zve_properties(const std::string&, const char*);
|
|
};
|
|
|
|
#endif
|
|
|