/// <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; } } }
public RV32_InstructionDecoder(RV32_RegisterSet reg, RV32_Calculators alu, RV32_LoadStoreUnit lsu) { Reg = reg; this.alu = alu; this.lsu = lsu; }