+ if (p_constraintCoreId)
+ xbt_free(p_constraintCoreId);
+ if (p_speedPeakList)
+ xbt_dynar_free(&p_speedPeakList);
+}
+
+double Cpu::getCurrentPowerPeak()
+{
+ return p_speed.peak;
+}
+
+int Cpu::getNbPStates()
+{
+ return xbt_dynar_length(p_speedPeakList);
+}
+
+void Cpu::setPState(int pstate_index)
+{
+ xbt_dynar_t plist = p_speedPeakList;
+ xbt_assert(pstate_index <= (int)xbt_dynar_length(plist),
+ "Invalid parameters for CPU %s (pstate %d > length of pstates %d)", getName(), pstate_index, (int)xbt_dynar_length(plist));
+
+ double new_peak_speed = xbt_dynar_get_as(plist, pstate_index, double);
+ m_pstate = pstate_index;
+ p_speed.peak = new_peak_speed;
+
+ onSpeedChange();
+}
+
+int Cpu::getPState()
+{
+ return m_pstate;
+}
+
+double Cpu::getPowerPeakAt(int pstate_index)
+{
+ xbt_dynar_t plist = p_speedPeakList;
+ xbt_assert((pstate_index <= (int)xbt_dynar_length(plist)), "Invalid parameters (pstate index out of bounds)");
+
+ return xbt_dynar_get_as(plist, pstate_index, double);
+}
+
+double Cpu::getSpeed(double load)
+{
+ return load * p_speed.peak;
+}
+
+double Cpu::getAvailableSpeed()
+{
+/* number between 0 and 1 */
+ return p_speed.scale;
+}
+
+void Cpu::onSpeedChange() {
+ TRACE_surf_host_set_speed(surf_get_clock(), getName(),
+ m_core * p_speed.scale * p_speed.peak);
+}
+
+
+int Cpu::getCore()
+{
+ return m_core;