<% max_len = 0 for knob in knobs: if len(knob[0]) > max_len: max_len = len(knob[0]) max_len += len('KNOB_ ') if max_len % 4: max_len += 4 - (max_len % 4) def space_knob(knob): knob_len = len('KNOB_' + knob) return ' '*(max_len - knob_len) def calc_max_name_len(choices_array): _max_len = 0 for choice in choices_array: if len(choice['name']) > _max_len: _max_len = len(choice['name']) if _max_len % 4: _max_len += 4 - (_max_len % 4) return _max_len def space_name(name, max_len): name_len = len(name) return ' '*(max_len - name_len) %>/****************************************************************************** * * Copyright 2015-2016 * Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http ://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * % if gen_header: * @file ${filename}.h % else: * @file ${filename}.cpp % endif * * @brief Dynamic Knobs for Core. * * ======================= AUTO GENERATED: DO NOT EDIT !!! ==================== * ******************************************************************************/ %if gen_header: #pragma once #include template struct Knob { const T& Value() const { return m_Value; } const T& Value(const T& newValue) { m_Value = newValue; return Value(); } protected: Knob(const T& defaultValue) : m_Value(defaultValue) {} private: T m_Value; }; #define DEFINE_KNOB(_name, _type, _default) \\ struct Knob_##_name : Knob<_type> \\ { \\ Knob_##_name() : Knob<_type>(_default) { } \\ static const char* Name() { return "KNOB_" #_name; } \\ } _name; #define GET_KNOB(_name) g_GlobalKnobs._name.Value() #define SET_KNOB(_name, _newValue) g_GlobalKnobs._name.Value(_newValue) struct GlobalKnobs { % for knob in knobs: //----------------------------------------------------------- // KNOB_${knob[0]} // % for line in knob[1]['desc']: // ${line} % endfor % if knob[1].get('choices'): <% choices = knob[1].get('choices') _max_len = calc_max_name_len(choices) %>// % for i in range(len(choices)): // ${choices[i]['name']}${space_name(choices[i]['name'], _max_len)} = ${format(choices[i]['value'], '#010x')} % endfor % endif // % if knob[1]['type'] == 'std::string': DEFINE_KNOB(${knob[0]}, ${knob[1]['type']}, "${repr(knob[1]['default'])[1:-1]}"); % else: DEFINE_KNOB(${knob[0]}, ${knob[1]['type']}, ${knob[1]['default']}); % endif % endfor GlobalKnobs(); std::string ToString(const char* optPerLinePrefix=""); }; extern GlobalKnobs g_GlobalKnobs; % for knob in knobs: #define KNOB_${knob[0]}${space_knob(knob[0])} GET_KNOB(${knob[0]}) % endfor % else: % for inc in includes: #include <${inc}> % endfor //======================================================== // Static Data Members //======================================================== GlobalKnobs g_GlobalKnobs; //======================================================== // Knob Initialization //======================================================== GlobalKnobs::GlobalKnobs() { % for knob in knobs: InitKnob(${knob[0]}); % endfor } //======================================================== // Knob Display (Convert to String) //======================================================== std::string GlobalKnobs::ToString(const char* optPerLinePrefix) { std::basic_stringstream str; str << std::showbase << std::setprecision(1) << std::fixed; if (optPerLinePrefix == nullptr) { optPerLinePrefix = ""; } % for knob in knobs: str << optPerLinePrefix << "KNOB_${knob[0]}:${space_knob(knob[0])}"; % if knob[1]['type'] == 'bool': str << (KNOB_${knob[0]} ? "+\n" : "-\n"); % elif knob[1]['type'] != 'float' and knob[1]['type'] != 'std::string': str << std::hex << std::setw(11) << std::left << KNOB_${knob[0]}; str << std::dec << KNOB_${knob[0]} << "\n"; % else: str << KNOB_${knob[0]} << "\n"; % endif % endfor str << std::ends; return str.str(); } % endif