111420Sdavid.guillen@arm.com/*
211420Sdavid.guillen@arm.com * Copyright (c) 2015 ARM Limited
311420Sdavid.guillen@arm.com * All rights reserved
411420Sdavid.guillen@arm.com *
511420Sdavid.guillen@arm.com * The license below extends only to copyright in the software and shall
611420Sdavid.guillen@arm.com * not be construed as granting a license to any other intellectual
711420Sdavid.guillen@arm.com * property including but not limited to intellectual property relating
811420Sdavid.guillen@arm.com * to a hardware implementation of the functionality of the software
911420Sdavid.guillen@arm.com * licensed hereunder.  You may use the software subject to the license
1011420Sdavid.guillen@arm.com * terms below provided that you ensure that this notice is replicated
1111420Sdavid.guillen@arm.com * unmodified and in its entirety in all distributions of the software,
1211420Sdavid.guillen@arm.com * modified or unmodified, in source code or in binary form.
1311420Sdavid.guillen@arm.com *
1411420Sdavid.guillen@arm.com * Redistribution and use in source and binary forms, with or without
1511420Sdavid.guillen@arm.com * modification, are permitted provided that the following conditions are
1611420Sdavid.guillen@arm.com * met: redistributions of source code must retain the above copyright
1711420Sdavid.guillen@arm.com * notice, this list of conditions and the following disclaimer;
1811420Sdavid.guillen@arm.com * redistributions in binary form must reproduce the above copyright
1911420Sdavid.guillen@arm.com * notice, this list of conditions and the following disclaimer in the
2011420Sdavid.guillen@arm.com * documentation and/or other materials provided with the distribution;
2111420Sdavid.guillen@arm.com * neither the name of the copyright holders nor the names of its
2211420Sdavid.guillen@arm.com * contributors may be used to endorse or promote products derived from
2311420Sdavid.guillen@arm.com * this software without specific prior written permission.
2411420Sdavid.guillen@arm.com *
2511420Sdavid.guillen@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2611420Sdavid.guillen@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2711420Sdavid.guillen@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2811420Sdavid.guillen@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2911420Sdavid.guillen@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3011420Sdavid.guillen@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3111420Sdavid.guillen@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3211420Sdavid.guillen@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3311420Sdavid.guillen@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3411420Sdavid.guillen@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3511420Sdavid.guillen@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3611420Sdavid.guillen@arm.com *
3711420Sdavid.guillen@arm.com * Authors: David Guillen Fandos
3811420Sdavid.guillen@arm.com */
3911420Sdavid.guillen@arm.com
4011420Sdavid.guillen@arm.com#ifndef __SIM_THERMAL_MODEL_HH__
4111420Sdavid.guillen@arm.com#define __SIM_THERMAL_MODEL_HH__
4211420Sdavid.guillen@arm.com
4311420Sdavid.guillen@arm.com#include <vector>
4411420Sdavid.guillen@arm.com
4511420Sdavid.guillen@arm.com#include "params/ThermalCapacitor.hh"
4611420Sdavid.guillen@arm.com#include "params/ThermalModel.hh"
4711420Sdavid.guillen@arm.com#include "params/ThermalReference.hh"
4811420Sdavid.guillen@arm.com#include "params/ThermalResistor.hh"
4911420Sdavid.guillen@arm.com#include "sim/clocked_object.hh"
5011899Sandreas.sandberg@arm.com#include "sim/power/thermal_domain.hh"
5111420Sdavid.guillen@arm.com#include "sim/power/thermal_entity.hh"
5211899Sandreas.sandberg@arm.com#include "sim/power/thermal_node.hh"
5311420Sdavid.guillen@arm.com#include "sim/sim_object.hh"
5411420Sdavid.guillen@arm.com
5511420Sdavid.guillen@arm.com
5611420Sdavid.guillen@arm.com/**
5711420Sdavid.guillen@arm.com * A ThermalResistor is used to model a thermal resistance between two
5811420Sdavid.guillen@arm.com * thermal domains. This domains can be either a reference (fixed temp.) or
5911420Sdavid.guillen@arm.com * a heat producer (power source).
6011420Sdavid.guillen@arm.com */
6111420Sdavid.guillen@arm.comclass ThermalResistor : public SimObject, public ThermalEntity
6211420Sdavid.guillen@arm.com{
6311420Sdavid.guillen@arm.com  public:
6411420Sdavid.guillen@arm.com    typedef ThermalResistorParams Params;
6511420Sdavid.guillen@arm.com    ThermalResistor(const Params *p);
6611420Sdavid.guillen@arm.com
6711420Sdavid.guillen@arm.com    void serialize(CheckpointOut &cp) const override;
6811420Sdavid.guillen@arm.com    void unserialize(CheckpointIn &cp) override;
6911420Sdavid.guillen@arm.com
7011420Sdavid.guillen@arm.com    void setNodes(ThermalNode * n1, ThermalNode * n2) {
7111420Sdavid.guillen@arm.com        node1 = n1;
7211420Sdavid.guillen@arm.com        node2 = n2;
7311420Sdavid.guillen@arm.com    }
7411420Sdavid.guillen@arm.com
7511420Sdavid.guillen@arm.com    LinearEquation getEquation(ThermalNode * tn, unsigned n,
7611442Sandreas.hansson@arm.com                               double step) const override;
7711420Sdavid.guillen@arm.com
7811420Sdavid.guillen@arm.com  private:
7911420Sdavid.guillen@arm.com    /* Resistance value in K/W */
8011420Sdavid.guillen@arm.com    double _resistance;
8111420Sdavid.guillen@arm.com    /* Nodes connected to the resistor */
8211420Sdavid.guillen@arm.com    ThermalNode * node1, * node2;
8311420Sdavid.guillen@arm.com};
8411420Sdavid.guillen@arm.com
8511420Sdavid.guillen@arm.com/**
8611420Sdavid.guillen@arm.com * A ThermalCapacitor is used to model a thermal capacitance between two
8711420Sdavid.guillen@arm.com * thermal domains. This domains can be either a reference (fixed temp.) or
8811420Sdavid.guillen@arm.com * a heat producer (power source).
8911420Sdavid.guillen@arm.com */
9011420Sdavid.guillen@arm.comclass ThermalCapacitor : public SimObject, public ThermalEntity
9111420Sdavid.guillen@arm.com{
9211420Sdavid.guillen@arm.com  public:
9311420Sdavid.guillen@arm.com    typedef ThermalCapacitorParams Params;
9411420Sdavid.guillen@arm.com    ThermalCapacitor(const Params *p);
9511420Sdavid.guillen@arm.com
9611420Sdavid.guillen@arm.com    void serialize(CheckpointOut &cp) const override;
9711420Sdavid.guillen@arm.com    void unserialize(CheckpointIn &cp) override;
9811420Sdavid.guillen@arm.com
9911420Sdavid.guillen@arm.com    LinearEquation getEquation(ThermalNode * tn, unsigned n,
10011442Sandreas.hansson@arm.com                               double step) const override;
10111420Sdavid.guillen@arm.com
10211420Sdavid.guillen@arm.com    void setNodes(ThermalNode * n1, ThermalNode * n2) {
10311420Sdavid.guillen@arm.com        node1 = n1;
10411420Sdavid.guillen@arm.com        node2 = n2;
10511420Sdavid.guillen@arm.com    }
10611420Sdavid.guillen@arm.com
10711420Sdavid.guillen@arm.com  private:
10811420Sdavid.guillen@arm.com    /* Capacitance value in J/K */
10911420Sdavid.guillen@arm.com    double _capacitance;
11011420Sdavid.guillen@arm.com    /* Nodes connected to the resistor */
11111420Sdavid.guillen@arm.com    ThermalNode * node1, * node2;
11211420Sdavid.guillen@arm.com};
11311420Sdavid.guillen@arm.com
11411420Sdavid.guillen@arm.com/**
11511420Sdavid.guillen@arm.com * A ThermalReference is a thermal domain with fixed temperature.
11611420Sdavid.guillen@arm.com * It's the homologue to the voltage source in a circuit.
11711420Sdavid.guillen@arm.com */
11811420Sdavid.guillen@arm.comclass ThermalReference : public SimObject, public ThermalEntity
11911420Sdavid.guillen@arm.com{
12011420Sdavid.guillen@arm.com  public:
12111420Sdavid.guillen@arm.com    typedef ThermalReferenceParams Params;
12211420Sdavid.guillen@arm.com    ThermalReference(const Params *p);
12311420Sdavid.guillen@arm.com
12411420Sdavid.guillen@arm.com    void setNode(ThermalNode * n) {
12511420Sdavid.guillen@arm.com        node = n;
12611420Sdavid.guillen@arm.com    }
12711420Sdavid.guillen@arm.com
12811420Sdavid.guillen@arm.com    LinearEquation getEquation(ThermalNode * tn, unsigned n,
12911442Sandreas.hansson@arm.com                               double step) const override;
13011420Sdavid.guillen@arm.com
13111420Sdavid.guillen@arm.com    void serialize(CheckpointOut &cp) const override;
13211420Sdavid.guillen@arm.com    void unserialize(CheckpointIn &cp) override;
13311420Sdavid.guillen@arm.com
13411420Sdavid.guillen@arm.com    /* Fixed temperature value in centigrate degrees */
13511420Sdavid.guillen@arm.com    double _temperature;
13611420Sdavid.guillen@arm.com    /* Nodes connected to the resistor */
13711420Sdavid.guillen@arm.com    ThermalNode * node;
13811420Sdavid.guillen@arm.com};
13911420Sdavid.guillen@arm.com
14011420Sdavid.guillen@arm.com
14111420Sdavid.guillen@arm.com/**
14212678Sjason@lowepower.com * @sa \ref gem5PowerModel "gem5 Thermal Model"
14312678Sjason@lowepower.com *
14411420Sdavid.guillen@arm.com * A ThermalModel is the element which ties all thermal objects
14511420Sdavid.guillen@arm.com * together and provides the thermal solver to the system.
14611420Sdavid.guillen@arm.com * It is reponsible for updating temperature for all Thermal
14711420Sdavid.guillen@arm.com * Domains over time by reading power from simobjects.
14811420Sdavid.guillen@arm.com */
14911420Sdavid.guillen@arm.comclass ThermalModel : public ClockedObject
15011420Sdavid.guillen@arm.com{
15111420Sdavid.guillen@arm.com  public:
15211420Sdavid.guillen@arm.com    typedef ThermalModelParams Params;
15311420Sdavid.guillen@arm.com    ThermalModel(const Params *p);
15411420Sdavid.guillen@arm.com
15511420Sdavid.guillen@arm.com    void addDomain(ThermalDomain * d);
15611420Sdavid.guillen@arm.com    void addReference(ThermalReference * r);
15711420Sdavid.guillen@arm.com    void addCapacitor(ThermalCapacitor * c);
15811420Sdavid.guillen@arm.com    void addResistor(ThermalResistor * r);
15911420Sdavid.guillen@arm.com
16011420Sdavid.guillen@arm.com    void addNode(ThermalNode * n) { nodes.push_back(n); }
16111420Sdavid.guillen@arm.com
16211420Sdavid.guillen@arm.com    double getTemp() const;
16311420Sdavid.guillen@arm.com
16411442Sandreas.hansson@arm.com    void startup() override;
16511420Sdavid.guillen@arm.com    void doStep();
16611420Sdavid.guillen@arm.com
16711420Sdavid.guillen@arm.com    void serialize(CheckpointOut &cp) const override;
16811420Sdavid.guillen@arm.com    void unserialize(CheckpointIn &cp) override;
16911420Sdavid.guillen@arm.com  private:
17011420Sdavid.guillen@arm.com
17111420Sdavid.guillen@arm.com    /* Keep track of all components used for the thermal model */
17211420Sdavid.guillen@arm.com    std::vector <ThermalDomain *> domains;
17311420Sdavid.guillen@arm.com    std::vector <ThermalReference *> references;
17411420Sdavid.guillen@arm.com    std::vector <ThermalCapacitor *> capacitors;
17511420Sdavid.guillen@arm.com    std::vector <ThermalResistor *> resistors;
17611420Sdavid.guillen@arm.com
17711420Sdavid.guillen@arm.com    std::vector <ThermalEntity *> entities;
17811420Sdavid.guillen@arm.com
17911420Sdavid.guillen@arm.com    /* Keep a list of the instantiated nodes */
18011420Sdavid.guillen@arm.com    std::vector <ThermalNode*> nodes;
18111420Sdavid.guillen@arm.com    std::vector <ThermalNode*> eq_nodes;
18211420Sdavid.guillen@arm.com
18311420Sdavid.guillen@arm.com    /** Stepping event to update the model values */
18412088Sspwilson2@wisc.edu    EventFunctionWrapper stepEvent;
18511420Sdavid.guillen@arm.com
18611420Sdavid.guillen@arm.com    /** Step in seconds for thermal updates */
18711420Sdavid.guillen@arm.com    double _step;
18811420Sdavid.guillen@arm.com
18911420Sdavid.guillen@arm.com};
19011420Sdavid.guillen@arm.com
19111420Sdavid.guillen@arm.com#endif
192