111973Sandreas.sandberg@arm.com# Copyright (c) 2017 ARM Limited
211973Sandreas.sandberg@arm.com# All rights reserved.
311973Sandreas.sandberg@arm.com#
411973Sandreas.sandberg@arm.com# The license below extends only to copyright in the software and shall
511973Sandreas.sandberg@arm.com# not be construed as granting a license to any other intellectual
611973Sandreas.sandberg@arm.com# property including but not limited to intellectual property relating
711973Sandreas.sandberg@arm.com# to a hardware implementation of the functionality of the software
811973Sandreas.sandberg@arm.com# licensed hereunder.  You may use the software subject to the license
911973Sandreas.sandberg@arm.com# terms below provided that you ensure that this notice is replicated
1011973Sandreas.sandberg@arm.com# unmodified and in its entirety in all distributions of the software,
1111973Sandreas.sandberg@arm.com# modified or unmodified, in source code or in binary form.
1211973Sandreas.sandberg@arm.com#
1311973Sandreas.sandberg@arm.com# Redistribution and use in source and binary forms, with or without
1411973Sandreas.sandberg@arm.com# modification, are permitted provided that the following conditions are
1511973Sandreas.sandberg@arm.com# met: redistributions of source code must retain the above copyright
1611973Sandreas.sandberg@arm.com# notice, this list of conditions and the following disclaimer;
1711973Sandreas.sandberg@arm.com# redistributions in binary form must reproduce the above copyright
1811973Sandreas.sandberg@arm.com# notice, this list of conditions and the following disclaimer in the
1911973Sandreas.sandberg@arm.com# documentation and/or other materials provided with the distribution;
2011973Sandreas.sandberg@arm.com# neither the name of the copyright holders nor the names of its
2111973Sandreas.sandberg@arm.com# contributors may be used to endorse or promote products derived from
2211973Sandreas.sandberg@arm.com# this software without specific prior written permission.
2311973Sandreas.sandberg@arm.com#
2411973Sandreas.sandberg@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2511973Sandreas.sandberg@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2611973Sandreas.sandberg@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2711973Sandreas.sandberg@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2811973Sandreas.sandberg@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2911973Sandreas.sandberg@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3011973Sandreas.sandberg@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3111973Sandreas.sandberg@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3211973Sandreas.sandberg@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3311973Sandreas.sandberg@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3411973Sandreas.sandberg@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3511973Sandreas.sandberg@arm.com#
3611973Sandreas.sandberg@arm.com# Authors: Andreas Sandberg
3711973Sandreas.sandberg@arm.com#          Stephan Diestelhorst
3811973Sandreas.sandberg@arm.com
3911973Sandreas.sandberg@arm.com# This configuration file extends the example ARM big.LITTLE(tm)
4011973Sandreas.sandberg@arm.com# with example power models.
4111973Sandreas.sandberg@arm.com
4212564Sgabeblack@google.comfrom __future__ import print_function
4313774Sandreas.sandberg@arm.comfrom __future__ import absolute_import
4412564Sgabeblack@google.com
4511973Sandreas.sandberg@arm.comimport argparse
4611973Sandreas.sandberg@arm.comimport os
4711973Sandreas.sandberg@arm.com
4811973Sandreas.sandberg@arm.comimport m5
4911973Sandreas.sandberg@arm.comfrom m5.objects import MathExprPowerModel, PowerModel
5011973Sandreas.sandberg@arm.com
5111973Sandreas.sandberg@arm.comimport fs_bigLITTLE as bL
5211973Sandreas.sandberg@arm.com
5311973Sandreas.sandberg@arm.com
5411973Sandreas.sandberg@arm.comclass CpuPowerOn(MathExprPowerModel):
5511973Sandreas.sandberg@arm.com    # 2A per IPC, 3pA per cache miss
5611973Sandreas.sandberg@arm.com    # and then convert to Watt
5711973Sandreas.sandberg@arm.com    dyn = "voltage * (2 * ipc + " \
5811973Sandreas.sandberg@arm.com            "3 * 0.000000001 * dcache.overall_misses / sim_seconds)"
5911973Sandreas.sandberg@arm.com    st = "4 * temp"
6011973Sandreas.sandberg@arm.com
6111973Sandreas.sandberg@arm.comclass CpuPowerOff(MathExprPowerModel):
6211973Sandreas.sandberg@arm.com    dyn = "0"
6311973Sandreas.sandberg@arm.com    st = "0"
6411973Sandreas.sandberg@arm.com
6511973Sandreas.sandberg@arm.comclass CpuPowerModel(PowerModel):
6611973Sandreas.sandberg@arm.com    pm = [
6711973Sandreas.sandberg@arm.com        CpuPowerOn(), # ON
6811973Sandreas.sandberg@arm.com        CpuPowerOff(), # CLK_GATED
6911973Sandreas.sandberg@arm.com        CpuPowerOff(), # SRAM_RETENTION
7011973Sandreas.sandberg@arm.com        CpuPowerOff(), # OFF
7111973Sandreas.sandberg@arm.com    ]
7211973Sandreas.sandberg@arm.com
7313022Selhabbalsherif@gmail.comclass L2PowerOn(MathExprPowerModel):
7413022Selhabbalsherif@gmail.com    # Example to report l2 Cache overall_accesses
7513022Selhabbalsherif@gmail.com    # The estimated power is converted to Watt and will vary based on the size of the cache
7613022Selhabbalsherif@gmail.com    dyn = "overall_accesses*0.000018000"
7713022Selhabbalsherif@gmail.com    st = "(voltage * 3)/10"
7813022Selhabbalsherif@gmail.com
7913022Selhabbalsherif@gmail.comclass L2PowerOff(MathExprPowerModel):
8013022Selhabbalsherif@gmail.com    dyn = "0"
8113022Selhabbalsherif@gmail.com    st = "0"
8213022Selhabbalsherif@gmail.com
8313022Selhabbalsherif@gmail.comclass L2PowerModel(PowerModel):
8413022Selhabbalsherif@gmail.com    # Choose a power model for every power state
8513022Selhabbalsherif@gmail.com    pm = [
8613022Selhabbalsherif@gmail.com        L2PowerOn(), # ON
8713022Selhabbalsherif@gmail.com        L2PowerOff(), # CLK_GATED
8813022Selhabbalsherif@gmail.com        L2PowerOff(), # SRAM_RETENTION
8913022Selhabbalsherif@gmail.com        L2PowerOff(), # OFF
9013022Selhabbalsherif@gmail.com    ]
9113022Selhabbalsherif@gmail.com
9211973Sandreas.sandberg@arm.com
9311973Sandreas.sandberg@arm.comdef main():
9411973Sandreas.sandberg@arm.com    parser = argparse.ArgumentParser(
9511973Sandreas.sandberg@arm.com        description="Generic ARM big.LITTLE configuration with "\
9611973Sandreas.sandberg@arm.com        "example power models")
9711973Sandreas.sandberg@arm.com    bL.addOptions(parser)
9811973Sandreas.sandberg@arm.com    options = parser.parse_args()
9911973Sandreas.sandberg@arm.com
10011973Sandreas.sandberg@arm.com    if options.cpu_type != "timing":
10111973Sandreas.sandberg@arm.com        m5.fatal("The power example script requires 'timing' CPUs.")
10211973Sandreas.sandberg@arm.com
10311973Sandreas.sandberg@arm.com    root = bL.build(options)
10411973Sandreas.sandberg@arm.com
10511973Sandreas.sandberg@arm.com    # Wire up some example power models to the CPUs
10611973Sandreas.sandberg@arm.com    for cpu in root.system.descendants():
10711973Sandreas.sandberg@arm.com        if not isinstance(cpu, m5.objects.BaseCPU):
10811973Sandreas.sandberg@arm.com            continue
10911973Sandreas.sandberg@arm.com
11011973Sandreas.sandberg@arm.com        cpu.default_p_state = "ON"
11111973Sandreas.sandberg@arm.com        cpu.power_model = CpuPowerModel()
11211973Sandreas.sandberg@arm.com
11313022Selhabbalsherif@gmail.com    # Example power model for the L2 Cache of the bigCluster
11413022Selhabbalsherif@gmail.com    for l2 in root.system.bigCluster.l2.descendants():
11513022Selhabbalsherif@gmail.com        if not isinstance(l2, m5.objects.Cache):
11613022Selhabbalsherif@gmail.com            continue
11713022Selhabbalsherif@gmail.com
11813022Selhabbalsherif@gmail.com        l2.default_p_state = "ON"
11913022Selhabbalsherif@gmail.com        l2.power_model = L2PowerModel()
12013022Selhabbalsherif@gmail.com
12111973Sandreas.sandberg@arm.com    bL.instantiate(options)
12211973Sandreas.sandberg@arm.com
12312564Sgabeblack@google.com    print("*" * 70)
12412564Sgabeblack@google.com    print("WARNING: The power numbers generated by this script are "
12512564Sgabeblack@google.com        "examples. They are not representative of any particular "
12612564Sgabeblack@google.com        "implementation or process.")
12712564Sgabeblack@google.com    print("*" * 70)
12811973Sandreas.sandberg@arm.com
12911973Sandreas.sandberg@arm.com    # Dumping stats periodically
13011973Sandreas.sandberg@arm.com    m5.stats.periodicStatDump(m5.ticks.fromSeconds(0.1E-3))
13111973Sandreas.sandberg@arm.com    bL.run()
13211973Sandreas.sandberg@arm.com
13311973Sandreas.sandberg@arm.com
13411973Sandreas.sandberg@arm.comif __name__ == "__m5_main__":
13511973Sandreas.sandberg@arm.com    main()
136