1 # Copyright (c) 2018 ARM Limited
4 # The license below extends only to copyright in the software and shall
5 # not be construed as granting a license to any other intellectual
6 # property including but not limited to intellectual property relating
7 # to a hardware implementation of the functionality of the software
8 # licensed hereunder. You may use the software subject to the license
9 # terms below provided that you ensure that this notice is replicated
10 # unmodified and in its entirety in all distributions of the software,
11 # modified or unmodified, in source code or in binary form.
13 # Redistribution and use in source and binary forms, with or without
14 # modification, are permitted provided that the following conditions are
15 # met: redistributions of source code must retain the above copyright
16 # notice, this list of conditions and the following disclaimer;
17 # redistributions in binary form must reproduce the above copyright
18 # notice, this list of conditions and the following disclaimer in the
19 # documentation and/or other materials provided with the distribution;
20 # neither the name of the copyright holders nor the names of its
21 # contributors may be used to endorse or promote products derived from
22 # this software without specific prior written permission.
24 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 from six
import string_types
38 from m5
.SimObject
import *
39 from m5
.params
import *
41 # QoS scheduler policy used to serve incoming transaction
42 class QoSPolicy(SimObject
):
45 cxx_header
= "mem/qos/policy.hh"
46 cxx_class
= 'QoS::Policy'
48 class QoSFixedPriorityPolicy(QoSPolicy
):
49 type = 'QoSFixedPriorityPolicy'
50 cxx_header
= "mem/qos/policy_fixed_prio.hh"
51 cxx_class
= 'QoS::FixedPriorityPolicy'
54 PyBindMethod('initRequestorName'),
55 PyBindMethod('initRequestorObj'),
58 _requestor_priorities
= None
60 def setRequestorPriority(self
, request_port
, priority
):
61 if not self
._requestor
_priorities
:
62 self
._requestor
_priorities
= []
64 self
._requestor
_priorities
.append([request_port
, priority
])
66 def setMasterPriority(self
, request_port
, priority
):
67 warn('QosFixedPriority.setMasterPriority is deprecated in favor of '
68 'setRequestorPriority. See src/mem/qos/QoSPolicy.py for more '
70 self
.setRequestorPriority(request_port
, priority
)
73 if not self
._requestor
_priorities
:
75 "use setRequestorPriority to init requestors/priorities\n");
78 for prio
in self
._requestor
_priorities
:
79 request_port
= prio
[0]
81 if isinstance(request_port
, string_types
):
82 self
.getCCObject().initRequestorName(
83 request_port
, int(priority
))
85 self
.getCCObject().initRequestorObj(
86 request_port
.getCCObject(), priority
)
88 # default fixed priority value for non-listed Requestors
89 qos_fixed_prio_default_prio
= Param
.UInt8(0,
90 "Default priority for non-listed Requestors")
92 class QoSPropFairPolicy(QoSPolicy
):
93 type = 'QoSPropFairPolicy'
94 cxx_header
= "mem/qos/policy_pf.hh"
95 cxx_class
= 'QoS::PropFairPolicy'
98 PyBindMethod('initRequestorName'),
99 PyBindMethod('initRequestorObj'),
102 _requestor_scores
= None
104 def setInitialScore(self
, request_port
, score
):
105 if not self
._requestor
_scores
:
106 self
._requestor
_scores
= []
108 self
._requestor
_scores
.append([request_port
, score
])
111 if not self
._requestor
_scores
:
112 print("Error, use setInitialScore to init requestors/scores\n");
115 for prio
in self
._requestor
_scores
:
116 request_port
= prio
[0]
118 if isinstance(request_port
, string_types
):
119 self
.getCCObject().initRequestorName(
120 request_port
, float(score
))
122 self
.getCCObject().initRequestorObj(
123 request_port
.getCCObject(), float(score
))
125 weight
= Param
.Float(0.5, "Pf score weight")