static void AddDfDependence(Instruction instrfrom, Instruction instrto, FromStage from, FromReg fromreg)
        {
            if (from == FromStage.DS)
            {
                ctx.forwarded.From_DFDS_EXDF = instrfrom;
                ctx.forwarded.To_DFDS_EXDF   = instrto;
                ctx.forwards.DFDS_EXDF++;

                ctx.forwardvalues.DS_To_DF_RT_Value = ctx.pipelineregs.DS__WB_ALUout_LMD;
                ctx.forwardvalues.Use_DS_To_DF_RT   = true;
            }
            else //from == FromStage.WB
            {
                ctx.forwarded.From_DSWB_EXDF = instrfrom;
                ctx.forwarded.To_DSWB_EXDF   = instrto;
                ctx.forwards.DSWB_EXDF++;

                ctx.forwardvalues.WB_To_DF_RT_Value = fromreg == FromReg.RD ? ctx.registers[(int)instrfrom.rd] : ctx.registers[(int)instrfrom.rt];
                ctx.forwardvalues.Use_WB_To_DF_RT   = true;
            }
        }
        static void AddExDependence(Instruction instrfrom, Instruction instrto, FromStage from, ToReg toreg, FromReg fromreg)
        {
            if (from == FromStage.DF)
            {
                ctx.forwarded.From_EXDF_RFEX = instrfrom;
                ctx.forwarded.To_EXDF_RFEX   = instrto;
                ctx.forwards.EXDF_RFEX++;

                if (toreg == ToReg.RS || toreg == ToReg.BASEREG) //On the left of ALU
                {
                    ctx.forwardvalues.DF_To_EX_Left_Value = ctx.DF_DS;
                    ctx.forwardvalues.Use_DF_To_EX_Left   = true;
                }
                else //toreg == ToReg.RT, on the right of ALU
                {
                    ctx.forwardvalues.DF_To_EX_Right_Value = ctx.DF_DS;
                    ctx.forwardvalues.Use_DF_To_EX_Right   = true;
                }
            }
            else if (from == FromStage.DS)
            {
                ctx.forwarded.From_DFDS_RFEX = instrfrom;
                ctx.forwarded.To_DFDS_RFEX   = instrto;
                ctx.forwards.DFDS_RFEX++;

                if (toreg == ToReg.RS || toreg == ToReg.BASEREG) //On the left of ALU
                {
                    ctx.forwardvalues.DS_To_EX_Left_Value = ctx.pipelineregs.DS__WB_ALUout_LMD;
                    ctx.forwardvalues.Use_DS_To_EX_Left   = true;
                }
                else //toreg == ToReg.RT, on the right of ALU
                {
                    ctx.forwardvalues.DS_To_EX_Right_Value = ctx.pipelineregs.DS__WB_ALUout_LMD;
                    ctx.forwardvalues.Use_DS_To_EX_Right   = true;
                }
            }
            else //from == FromStage.WB
            {
                ctx.forwarded.From_DSWB_RFEX = instrfrom;
                ctx.forwarded.To_DSWB_RFEX   = instrto;
                ctx.forwards.DSWB_RFEX++;

                if (toreg == ToReg.RS || toreg == ToReg.BASEREG) //On the left of ALU
                {
                    ctx.forwardvalues.WB_To_EX_Left_Value = fromreg == FromReg.RD ? ctx.registers[(int)instrfrom.rd] : ctx.registers[(int)instrfrom.rt];
                    ctx.forwardvalues.Use_WB_To_EX_Left   = true;
                }
                else //toreg == ToReg.RT, on the right of ALU
                {
                    ctx.forwardvalues.WB_To_EX_Right_Value = fromreg == FromReg.RD ? ctx.registers[(int)instrfrom.rd] : ctx.registers[(int)instrfrom.rt];
                    ctx.forwardvalues.Use_WB_To_EX_Right   = true;
                }
            }
        }