• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  * Copyright (C) 2015-2018 Intel Corporation.   All Rights Reserved.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  *
23  * @file ${filename}.h
24  *
25  * @brief Dynamic Knobs for Core.
26  *
27  * ======================= AUTO GENERATED: DO NOT EDIT !!! ====================
28  *
29  * Generation Command Line:
30  *  ${'\n *    '.join(cmdline)}
31  *
32  ******************************************************************************/
33 // clang-format off
34 <% calc_max_knob_len(knobs) %>
35 #pragma once
36 #include <string>
37 
38 struct KnobBase
39 {
40 private:
41     // Update the input string.
42     static void autoExpandEnvironmentVariables(std::string& text);
43 
44 protected:
45     // Leave input alone and return new string.
expandEnvironmentVariablesKnobBase46     static std::string expandEnvironmentVariables(std::string const& input)
47     {
48         std::string text = input;
49         autoExpandEnvironmentVariables(text);
50         return text;
51     }
52 
53     template <typename T>
expandEnvironmentVariablesKnobBase54     static T expandEnvironmentVariables(T const& input)
55     {
56         return input;
57     }
58 };
59 
60 template <typename T>
61 struct Knob : KnobBase
62 {
63 public:
ValueKnob64     const T& Value() const { return m_Value; }
ValueKnob65     const T& Value(T const& newValue)
66     {
67         m_Value = expandEnvironmentVariables(newValue);
68         return Value();
69     }
70 
71 private:
72     T m_Value;
73 };
74 
75 #define DEFINE_KNOB(_name, _type)                               \\
76 
77     struct Knob_##_name : Knob<_type>                           \\
78 
79     {                                                           \\
80 
Name_name81         static const char* Name() { return "KNOB_" #_name; }    \\
82 
DefaultValue_name83         static _type DefaultValue() { return (m_default); }     \\
84 
85     private:                                                    \\
86 
87         static _type m_default;                                 \\
88 
89     } _name;
90 
91 #define GET_KNOB(_name)             g_GlobalKnobs._name.Value()
92 #define SET_KNOB(_name, _newValue)  g_GlobalKnobs._name.Value(_newValue)
93 
94 struct GlobalKnobs
95 {
96     % for knob in knobs:
97     //-----------------------------------------------------------
98     // KNOB_${knob[0]}
99     //
100     % for line in knob[1]['desc']:
101     // ${line}
102     % endfor
103     % if knob[1].get('choices'):
104     <%
105     choices = knob[1].get('choices')
106     _max_len = calc_max_name_len(choices) %>//
107     % for i in range(len(choices)):
108     //     ${choices[i]['name']}${space_name(choices[i]['name'], _max_len)} = ${format(choices[i]['value'], '#010x')}
109     % endfor
110     % endif
111     //
112     DEFINE_KNOB(${knob[0]}, ${knob[1]['type']});
113 
114     % endfor
115 
116     std::string ToString(const char* optPerLinePrefix="");
117     GlobalKnobs();
118 };
119 extern GlobalKnobs g_GlobalKnobs;
120 
121 #undef DEFINE_KNOB
122 
123 % for knob in knobs:
124 #define KNOB_${knob[0]}${space_knob(knob[0])} GET_KNOB(${knob[0]})
125 % endfor
126 
127 <%!
128     # Globally available python
129     max_len = 0
130     def calc_max_knob_len(knobs):
131         global max_len
132         max_len = 0
133         for knob in knobs:
134             if len(knob[0]) > max_len: max_len = len(knob[0])
135         max_len += len('KNOB_ ')
136         if max_len % 4: max_len += 4 - (max_len % 4)
137 
138     def space_knob(knob):
139         knob_len = len('KNOB_' + knob)
140         return ' '*(max_len - knob_len)
141 
142     def calc_max_name_len(choices_array):
143         _max_len = 0
144         for choice in choices_array:
145             if len(choice['name']) > _max_len: _max_len = len(choice['name'])
146 
147         if _max_len % 4: _max_len += 4 - (_max_len % 4)
148         return _max_len
149 
150     def space_name(name, max_len):
151         name_len = len(name)
152         return ' '*(max_len - name_len)
153 %>
154 // clang-format on
155