<% 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) %>/****************************************************************************** * * Copyright 2015 * 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 DEFINE_KNOB(${knob[0]}, ${knob[1]['type']}, ${knob[1]['default']}); % 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': 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