public static void SetPackagePowerLimitValues(PackagePowerLimitIndex idx, PackagePowerLimit ppl, PackagePowerLimitMask mask)
        {
            double pwr, erg, tme;
            GetRaplPowerUnits(out pwr, out erg, out tme);

            if ((mask & PackagePowerLimitMask.PowerLimit) == PackagePowerLimitMask.PowerLimit)
            {
                switch (idx)
                {
                    case PackagePowerLimitIndex._1:
                        SetRegisterValue(PropertiesRAPL_RegLocations.Instance.PkgPowerLimit1_MSR, PropertiesRAPL_RegLocations.Instance.PkgPowerLimit1_BitRange, (ulong)(ppl.PowerLimit / pwr));
                        break;
                    case PackagePowerLimitIndex._2:
                        SetRegisterValue(PropertiesRAPL_RegLocations.Instance.PkgPowerLimit2_MSR, PropertiesRAPL_RegLocations.Instance.PkgPowerLimit2_BitRange, (ulong)(ppl.PowerLimit / pwr));
                        break;
                }
            }

            if ((mask & PackagePowerLimitMask.TimeWindowForPowerLimit) == PackagePowerLimitMask.TimeWindowForPowerLimit)
            {
                ulong encodedTimeVal = EncodeTimeWindowForPowerLimit(ppl.TimeWindowForPowerLimit, tme);

                switch (idx)
                {
                    case PackagePowerLimitIndex._1:
                        SetRegisterValue(PropertiesRAPL_RegLocations.Instance.TimeWindowPowerLimit1_MSR, PropertiesRAPL_RegLocations.Instance.TimeWindowPowerLimit1_BitRange, encodedTimeVal);
                        break;
                    case PackagePowerLimitIndex._2:
                        SetRegisterValue(PropertiesRAPL_RegLocations.Instance.TimeWindowPowerLimit2_MSR, PropertiesRAPL_RegLocations.Instance.TimeWindowPowerLimit2_BitRange, encodedTimeVal);
                        break;
                }
            }

            if ((mask & PackagePowerLimitMask.EnablePowerLimit) == PackagePowerLimitMask.EnablePowerLimit)
            {
                switch (idx)
                {
                    case PackagePowerLimitIndex._1:
                        SetRegisterValue(PropertiesRAPL_RegLocations.Instance.EnablePowerLimit1_MSR, PropertiesRAPL_RegLocations.Instance.EnablePowerLimit1_Bit, ppl.EnablePowerLimit);
                        break;
                    case PackagePowerLimitIndex._2:
                        SetRegisterValue(PropertiesRAPL_RegLocations.Instance.EnablePowerLimit2_MSR, PropertiesRAPL_RegLocations.Instance.EnablePowerLimit2_Bit, ppl.EnablePowerLimit);
                        break;
                }
            }

            if ((mask & PackagePowerLimitMask.PackageClampingLimitation) == PackagePowerLimitMask.PackageClampingLimitation)
            {
                switch (idx)
                {
                    case PackagePowerLimitIndex._1:
                        SetRegisterValue(PropertiesRAPL_RegLocations.Instance.PackageClampingLimit1_MSR, PropertiesRAPL_RegLocations.Instance.PackageClampingLimit1_Bit, ppl.PackageClampingLimitation);
                        break;
                    case PackagePowerLimitIndex._2:
                        SetRegisterValue(PropertiesRAPL_RegLocations.Instance.PackageClampingLimit2_MSR, PropertiesRAPL_RegLocations.Instance.PackageClampingLimit2_Bit, ppl.PackageClampingLimitation);
                        break;
                }
            }
        }
        public static PackagePowerLimit GetPackagePowerLimitValues(PackagePowerLimitIndex idx)
        {
            double pwr, erg, tme;
            GetRaplPowerUnits(out pwr, out erg, out tme);

            PackagePowerLimit pplv = new PackagePowerLimit();
            switch (idx)
            {
                case PackagePowerLimitIndex._1:
                    pplv.PowerLimit = GetPackagePowerLimit1_RegVal() * pwr;
                    pplv.TimeWindowForPowerLimit = DecodeTimeWindowForPowerLimit(GetTimeWindowPowerLimit1_RegVal(), tme);
                    pplv.EnablePowerLimit = GetRegisterValue(PropertiesRAPL_RegLocations.Instance.EnablePowerLimit1_MSR, PropertiesRAPL_RegLocations.Instance.EnablePowerLimit1_Bit);
                    pplv.PackageClampingLimitation = GetRegisterValue(PropertiesRAPL_RegLocations.Instance.PackageClampingLimit1_MSR, PropertiesRAPL_RegLocations.Instance.PackageClampingLimit1_Bit);
                    break;
                case PackagePowerLimitIndex._2:
                    pplv.PowerLimit = GetPackagePowerLimit2_RegVal() * pwr;
                    pplv.TimeWindowForPowerLimit = DecodeTimeWindowForPowerLimit(GetTimeWindowPowerLimit2_RegVal(), tme);
                    pplv.EnablePowerLimit = GetRegisterValue(PropertiesRAPL_RegLocations.Instance.EnablePowerLimit2_MSR, PropertiesRAPL_RegLocations.Instance.EnablePowerLimit2_Bit);
                    pplv.PackageClampingLimitation = GetRegisterValue(PropertiesRAPL_RegLocations.Instance.PackageClampingLimit2_MSR, PropertiesRAPL_RegLocations.Instance.PackageClampingLimit2_Bit);
                    break;
            }
            return pplv;
        }