/// <summary>Risc-V CPU例外のインスタンスを初期化します</summary> public RiscvException(RiscvExceptionCause cause, UInt32 tval, RV32_RegisterSet reg) : base(Enum.GetName(typeof(RiscvExceptionCause), cause)) { // nullチェック if (reg is null) { throw new ArgumentNullException("reg"); } Data.Add("pc", reg.PC); Data.Add("cause", cause); Data.Add("tval", tval); reg.HandleException(cause, tval); }
/// <summary> /// 引数で与えられた命令セットをサポートし、メインメモリを持つ /// RISC-Vアーキテクチャの32bitCPUを生成する /// </summary> /// <param name="OptionsInstructionSet">拡張命令セットを表す文字列</param> /// <param name="mem">メインメモリとして使用するUInt32配列</param> public RV32_HaedwareThread(string OptionsInstructionSet, byte[] mem) { // 基本命令セットRV32I registerSet = new RV32_RegisterSet(new RV32_MemoryHandler(mem)); alu = new RV32_Calculators(registerSet); lsu = new RV32_LoadStoreUnit(registerSet); decoder = new RV32_InstructionDecoder(registerSet, alu, lsu); decoder.AddDecoder(typeof(RV32I_Decoder)); registerSet.AddMisa('I'); registerSet.AddMisa('S'); // 拡張命令セット foreach (char option in OptionsInstructionSet.ToCharArray()) { registerSet.AddMisa(option); switch (option) { case 'M': // RV32M 拡張命令セット decoder.AddDecoder(typeof(RV32M_Decoder)); break; case 'A': // RV32A 拡張命令セット decoder.AddDecoder(typeof(RV32A_Decoder)); registerSet.Mem = new RV32_AtomicMemoryHandler(mem); break; case 'C': // RV32C 拡張命令セット decoder.AddDecoder(typeof(RV32C_Decoder)); break; case 'F': // RV32F 拡張命令セット decoder.AddDecoder(typeof(RV32F_Decoder)); break; case 'D': // RV32D 拡張命令セット decoder.AddDecoder(typeof(RV32D_Decoder)); break; default: break; } } }
/// <summary>指定したメッセージおよびこの例外の原因となった内部例外への参照を使用して、Risc-V CPU例外のインスタンスを初期化します</summary> /// <param name="message">エラーを説明するメッセージ</param> /// <param name="innerException">現在の例外の原因である例外</param> public RiscvException(RiscvExceptionCause cause, UInt32 tval, RV32_RegisterSet reg, string message, Exception innerException) : base(Enum.GetName(typeof(RiscvExceptionCause), cause) + "\r\n" + message, innerException) { // nullチェック if (reg is null) { throw new ArgumentNullException("reg"); } if (message is null) { throw new ArgumentNullException("message"); } if (innerException is null) { throw new ArgumentNullException("innerException"); } Data.Add("pc", reg.PC); Data.Add("cause", cause); Data.Add("tval", tval); reg.HandleException(cause, tval); }
/// <summary> /// Risc-V 32bitCPU ALU /// </summary> /// <param name="registerSet">演算入出力用レジスタ</param> public RV32_Calculators(RV32_RegisterSet registerSet) { reg = registerSet; }
/// <summary> /// Risc-V 倍精度浮動小数算術論理演算 FPU /// </summary> /// <param name="registerSet">入出力用レジスタ</param> public RV32_DoubleFpu(RV32_RegisterSet reg) : base(reg) { }
/// <summary> /// Risc-V Atomic Memory Operate LSU /// </summary> /// <param name="registerSet">入出力用レジスタ</param> public RV32_AmoLsu(RV32_RegisterSet reg, RV32_AbstractMemoryHandler mainMemory) : base(reg, mainMemory) { }
/// <summary> /// Risc-V ロードストアユニット /// </summary> /// <param name="registerSet">入出力用レジスタ</param> /// <param name="mainMemory">メインメモリ</param> public RV32_IntegerLsu(RV32_RegisterSet registerSet, RV32_AbstractMemoryHandler mainMemory) : base(registerSet, mainMemory) { }
protected internal RV32_AbstractLoadStoreUnit(RV32_RegisterSet registerSet, RV32_AbstractMemoryHandler mainMemory) { reg = registerSet; }
/// <summary> /// Risc-V 32bitCPU LSU /// </summary> /// <param name="registerSet">入出力用レジスタ</param> /// <param name="registerSet">メインメモリ</param> public RV32_LoadStoreUnit(RV32_RegisterSet registerSet) { reg = registerSet; }
/// <summary> /// Risc-V 乗除算ALU /// </summary> /// <param name="registerSet">入出力用レジスタ</param> public RV32_Mac(RV32_RegisterSet reg) : base(reg) { }
/// <summary> /// Risc-V 単精度浮動小数算術論理演算 FPU /// </summary> /// <param name="registerSet">入出力用レジスタ</param> public RV32_SingleFpu(RV32_RegisterSet reg) : base(reg) { }
/// <summary>指定したメッセージおよびこの例外の原因となった内部例外への参照を使用して、Risc-V CPU 環境呼び出し例外のインスタンスを初期化します</summary> /// <param name="message">エラーを説明するメッセージ</param> /// <param name="innerException">現在の例外の原因である例外</param> public RiscvEnvironmentCallException(PrivilegeLevel currentLevel, RV32_RegisterSet rs, string message, Exception innerException) : base((RiscvExceptionCause)((byte)currentLevel | 0x8U), 0, rs, message, innerException) { }
/// <summary>Risc-V CPU 環境呼び出し例外のインスタンスを初期化します</summary> public RiscvEnvironmentCallException(PrivilegeLevel currentLevel, RV32_RegisterSet rs) : base((RiscvExceptionCause)((byte)currentLevel | 0x8U), 0, rs) { }
protected internal RV32_AbstractCalculator(RV32_RegisterSet registerSet) { reg = registerSet; }
/// <summary> /// Risc-V 浮動小数ロードストアユニット /// </summary> /// <param name="registerSet">入出力用レジスタ</param> /// <param name="mainMemory">メインメモリ</param> public RV32_FloatPointLsu(RV32_RegisterSet registerSet, RV32_AbstractMemoryHandler mainMemory) : base(registerSet, mainMemory) { }
public RV32_InstructionDecoder(RV32_RegisterSet reg, RV32_Calculators alu, RV32_LoadStoreUnit lsu) { Reg = reg; this.alu = alu; this.lsu = lsu; }
/// <summary> /// Risc-V 算術論理ALU /// </summary> /// <param name="registerSet">入出力用レジスタ</param> public RV32_IntegerAlu(RV32_RegisterSet reg) : base(reg) { }