Move generated code template to file
In preparation of enhancing the generated code format, the template used
has been externalized and will continue to be modified in future commits
to parse & generate more efficiently.
Tested:
Generated code remains unchanged
Resolves openbmc/phosphor-fan-presence#8
Change-Id: Ifbf718e8a22acb2f2f939bbdcc2e7fe041e9ed58
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/control/gen-fan-zone-defs.py b/control/gen-fan-zone-defs.py
index 43d98bc..644ce54 100755
--- a/control/gen-fan-zone-defs.py
+++ b/control/gen-fan-zone-defs.py
@@ -10,238 +10,7 @@
import yaml
from argparse import ArgumentParser
from mako.template import Template
-
-tmpl = '''\
-<%!
-def indent(str, depth):
- return ''.join(4*' '*depth+line for line in str.splitlines(True))
-%>\
-<%def name="genHandler(sig)" buffered="True">
-%if ('type' in sig['sparams']) and \
- (sig['sparams']['type'] is not None):
-${sig['signal']}<${sig['sparams']['type']}>(
-%else:
-${sig['signal']}(
-%endif
-%for spk in sig['sparams']['params']:
-${sig['sparams'][spk]},
-%endfor
-%if ('type' in sig['hparams']) and \
- (sig['hparams']['type'] is not None):
-handler::${sig['handler']}<${sig['hparams']['type']}>(
-%else:
-handler::${sig['handler']}(
-%endif
-%for i, hpk in enumerate(sig['hparams']['params']):
- %if (i+1) != len(sig['hparams']['params']):
- ${sig['hparams'][hpk]},
- %else:
- ${sig['hparams'][hpk]}
- %endif
-%endfor
-))
-</%def>\
-<%def name="genSSE(event)" buffered="True">
-Group{
-%for group in event['groups']:
-%for member in group['members']:
-{
- "${member['object']}",
- {"${member['interface']}",
- "${member['property']}"}
-},
-%endfor
-%endfor
-},
-std::vector<Action>{
-%for a in event['action']:
-%if len(a['parameters']) != 0:
-make_action(action::${a['name']}(
-%else:
-make_action(action::${a['name']}
-%endif
-%for i, p in enumerate(a['parameters']):
-%if (i+1) != len(a['parameters']):
- ${p},
-%else:
- ${p})
-%endif
-%endfor
-),
-%endfor
-},
-Timer{
- ${event['timer']['interval']},
- ${event['timer']['type']}
-},
-std::vector<Signal>{
-%for s in event['signals']:
- Signal{
- match::${s['match']}(
- %for i, mp in enumerate(s['mparams']):
- %if (i+1) != len(s['mparams']):
- "${mp}",
- %else:
- "${mp}"
- %endif
- %endfor
- ),
- make_handler(\
- ${indent(genHandler(sig=s), 3)}\
- )
- },
-%endfor
-}
-</%def>\
-/* This is a generated file. */
-#include "manager.hpp"
-#include "functor.hpp"
-#include "actions.hpp"
-#include "handlers.hpp"
-#include "preconditions.hpp"
-#include "matches.hpp"
-
-using namespace phosphor::fan::control;
-
-const unsigned int Manager::_powerOnDelay{${mgr_data['power_on_delay']}};
-
-const std::vector<ZoneGroup> Manager::_zoneLayouts
-{
-%for zone_group in zones:
- ZoneGroup{
- std::vector<Condition>{
- %for condition in zone_group['conditions']:
- Condition{
- "${condition['type']}",
- std::vector<ConditionProperty>{
- %for property in condition['properties']:
- ConditionProperty{
- "${property['property']}",
- "${property['interface']}",
- "${property['path']}",
- static_cast<${property['type']}>(${property['value']}),
- },
- %endfor
- },
- },
- %endfor
- },
- std::vector<ZoneDefinition>{
- %for zone in zone_group['zones']:
- ZoneDefinition{
- ${zone['num']},
- ${zone['full_speed']},
- ${zone['default_floor']},
- ${zone['increase_delay']},
- ${zone['decrease_interval']},
- std::vector<FanDefinition>{
- %for fan in zone['fans']:
- FanDefinition{
- "${fan['name']}",
- std::vector<std::string>{
- %for sensor in fan['sensors']:
- "${sensor}",
- %endfor
- },
- "${fan['target_interface']}"
- },
- %endfor
- },
- std::vector<SetSpeedEvent>{
- %for event in zone['events']:
- %if ('pc' in event) and \
- (event['pc'] is not None):
- SetSpeedEvent{
- Group{
- %for group in event['pc']['pcgrps']:
- %for member in group['members']:
- {
- "${member['object']}",
- {"${member['interface']}",
- "${member['property']}"}
- },
- %endfor
- %endfor
- },
- std::vector<Action>{
- %for i, a in enumerate(event['pc']['pcact']):
- %if len(a['params']) != 0:
- make_action(
- precondition::${a['name']}(
- %else:
- make_action(
- precondition::${a['name']}
- %endif
- %for p in a['params']:
- ${p['type']}${p['open']}
- %for j, v in enumerate(p['values']):
- %if (j+1) != len(p['values']):
- ${v['value']},
- %else:
- ${v['value']}
- %endif
- %endfor
- ${p['close']},
- %endfor
- %if (i+1) != len(event['pc']['pcact']):
- %if len(a['params']) != 0:
- )),
- %else:
- ),
- %endif
- %endif
- %endfor
- std::vector<SetSpeedEvent>{
- %for pcevt in event['pc']['pcevts']:
- SetSpeedEvent{\
- ${indent(genSSE(event=pcevt), 6)}\
- },
- %endfor
- %else:
- SetSpeedEvent{\
- ${indent(genSSE(event=event), 6)}
- %endif
- %if ('pc' in event) and (event['pc'] is not None):
- }
- %if len(event['pc']['pcact'][-1]['params']) != 0:
- )),
- %else:
- ),
- %endif
- },
- Timer{
- ${event['pc']['pctime']['interval']},
- ${event['pc']['pctime']['type']}
- },
- std::vector<Signal>{
- %for s in event['pc']['pcsigs']:
- Signal{
- match::${s['match']}(
- %for i, mp in enumerate(s['mparams']):
- %if (i+1) != len(s['mparams']):
- "${mp}",
- %else:
- "${mp}"
- %endif
- %endfor
- ),
- make_handler(\
- ${indent(genHandler(sig=s), 9)}\
- )
- },
- %endfor
- }
- %endif
- },
- %endfor
- }
- },
- %endfor
- }
- },
-%endfor
-};
-'''
+from mako.lookup import TemplateLookup
def convertToMap(listOfDict):
@@ -857,7 +626,18 @@
if manager_config.get('power_on_delay') is None:
manager_config['power_on_delay'] = 0
+ tmpls_dir = os.path.join(
+ os.path.dirname(os.path.realpath(__file__)),
+ "templates")
output_file = os.path.join(args.output_dir, "fan_zone_defs.cpp")
+ if sys.version_info < (3, 0):
+ lkup = TemplateLookup(
+ directories=tmpls_dir.split(),
+ disable_unicode=True)
+ else:
+ lkup = TemplateLookup(
+ directories=tmpls_dir.split())
+ tmpl = lkup.get_template('fan_zone_defs.mako.cpp')
with open(output_file, 'w') as output:
- output.write(Template(tmpl).render(zones=zone_config,
- mgr_data=manager_config))
+ output.write(tmpl.render(zones=zone_config,
+ mgr_data=manager_config))
diff --git a/control/templates/defs.mako b/control/templates/defs.mako
new file mode 100644
index 0000000..0980f81
--- /dev/null
+++ b/control/templates/defs.mako
@@ -0,0 +1,83 @@
+<%!
+def indent(str, depth):
+ return ''.join(4*' '*depth+line for line in str.splitlines(True))
+%>\
+
+<%def name="genHandler(sig)" buffered="True">
+%if ('type' in sig['sparams']) and \
+ (sig['sparams']['type'] is not None):
+${sig['signal']}<${sig['sparams']['type']}>(
+%else:
+${sig['signal']}(
+%endif
+%for spk in sig['sparams']['params']:
+${sig['sparams'][spk]},
+%endfor
+%if ('type' in sig['hparams']) and \
+ (sig['hparams']['type'] is not None):
+handler::${sig['handler']}<${sig['hparams']['type']}>(
+%else:
+handler::${sig['handler']}(
+%endif
+%for i, hpk in enumerate(sig['hparams']['params']):
+ %if (i+1) != len(sig['hparams']['params']):
+ ${sig['hparams'][hpk]},
+ %else:
+ ${sig['hparams'][hpk]}
+ %endif
+%endfor
+))
+</%def>\
+
+<%def name="genSSE(event)" buffered="True">
+Group{
+%for group in event['groups']:
+%for member in group['members']:
+{
+ "${member['object']}",
+ {"${member['interface']}",
+ "${member['property']}"}
+},
+%endfor
+%endfor
+},
+std::vector<Action>{
+%for a in event['action']:
+%if len(a['parameters']) != 0:
+make_action(action::${a['name']}(
+%else:
+make_action(action::${a['name']}
+%endif
+%for i, p in enumerate(a['parameters']):
+%if (i+1) != len(a['parameters']):
+ ${p},
+%else:
+ ${p})
+%endif
+%endfor
+),
+%endfor
+},
+Timer{
+ ${event['timer']['interval']},
+ ${event['timer']['type']}
+},
+std::vector<Signal>{
+%for s in event['signals']:
+ Signal{
+ match::${s['match']}(
+ %for i, mp in enumerate(s['mparams']):
+ %if (i+1) != len(s['mparams']):
+ "${mp}",
+ %else:
+ "${mp}"
+ %endif
+ %endfor
+ ),
+ make_handler(\
+ ${indent(genHandler(sig=s), 3)}\
+ )
+ },
+%endfor
+}
+</%def>\
diff --git a/control/templates/fan_zone_defs.mako.cpp b/control/templates/fan_zone_defs.mako.cpp
new file mode 100644
index 0000000..e735e0d
--- /dev/null
+++ b/control/templates/fan_zone_defs.mako.cpp
@@ -0,0 +1,154 @@
+<%include file="defs.mako"/>\
+<%namespace file="defs.mako" import="*"/>\
+<%!
+def indent(str, depth):
+ return ''.join(4*' '*depth+line for line in str.splitlines(True))
+%>\
+/* This is a generated file. */
+#include "manager.hpp"
+#include "functor.hpp"
+#include "actions.hpp"
+#include "handlers.hpp"
+#include "preconditions.hpp"
+#include "matches.hpp"
+
+using namespace phosphor::fan::control;
+
+const unsigned int Manager::_powerOnDelay{${mgr_data['power_on_delay']}};
+
+const std::vector<ZoneGroup> Manager::_zoneLayouts
+{
+%for zone_group in zones:
+ ZoneGroup{
+ std::vector<Condition>{
+ %for condition in zone_group['conditions']:
+ Condition{
+ "${condition['type']}",
+ std::vector<ConditionProperty>{
+ %for property in condition['properties']:
+ ConditionProperty{
+ "${property['property']}",
+ "${property['interface']}",
+ "${property['path']}",
+ static_cast<${property['type']}>(${property['value']}),
+ },
+ %endfor
+ },
+ },
+ %endfor
+ },
+ std::vector<ZoneDefinition>{
+ %for zone in zone_group['zones']:
+ ZoneDefinition{
+ ${zone['num']},
+ ${zone['full_speed']},
+ ${zone['default_floor']},
+ ${zone['increase_delay']},
+ ${zone['decrease_interval']},
+ std::vector<FanDefinition>{
+ %for fan in zone['fans']:
+ FanDefinition{
+ "${fan['name']}",
+ std::vector<std::string>{
+ %for sensor in fan['sensors']:
+ "${sensor}",
+ %endfor
+ },
+ "${fan['target_interface']}"
+ },
+ %endfor
+ },
+ std::vector<SetSpeedEvent>{
+ %for event in zone['events']:
+ %if ('pc' in event) and \
+ (event['pc'] is not None):
+ SetSpeedEvent{
+ Group{
+ %for group in event['pc']['pcgrps']:
+ %for member in group['members']:
+ {
+ "${member['object']}",
+ {"${member['interface']}",
+ "${member['property']}"}
+ },
+ %endfor
+ %endfor
+ },
+ std::vector<Action>{
+ %for i, a in enumerate(event['pc']['pcact']):
+ %if len(a['params']) != 0:
+ make_action(
+ precondition::${a['name']}(
+ %else:
+ make_action(
+ precondition::${a['name']}
+ %endif
+ %for p in a['params']:
+ ${p['type']}${p['open']}
+ %for j, v in enumerate(p['values']):
+ %if (j+1) != len(p['values']):
+ ${v['value']},
+ %else:
+ ${v['value']}
+ %endif
+ %endfor
+ ${p['close']},
+ %endfor
+ %if (i+1) != len(event['pc']['pcact']):
+ %if len(a['params']) != 0:
+ )),
+ %else:
+ ),
+ %endif
+ %endif
+ %endfor
+ std::vector<SetSpeedEvent>{
+ %for pcevt in event['pc']['pcevts']:
+ SetSpeedEvent{\
+ ${indent(genSSE(event=pcevt), 6)}\
+ },
+ %endfor
+ %else:
+ SetSpeedEvent{\
+ ${indent(genSSE(event=event), 6)}
+ %endif
+ %if ('pc' in event) and (event['pc'] is not None):
+ }
+ %if len(event['pc']['pcact'][-1]['params']) != 0:
+ )),
+ %else:
+ ),
+ %endif
+ },
+ Timer{
+ ${event['pc']['pctime']['interval']},
+ ${event['pc']['pctime']['type']}
+ },
+ std::vector<Signal>{
+ %for s in event['pc']['pcsigs']:
+ Signal{
+ match::${s['match']}(
+ %for i, mp in enumerate(s['mparams']):
+ %if (i+1) != len(s['mparams']):
+ "${mp}",
+ %else:
+ "${mp}"
+ %endif
+ %endfor
+ ),
+ make_handler(\
+ ${indent(genHandler(sig=s), 9)}\
+ )
+ },
+ %endfor
+ }
+ %endif
+ },
+ %endfor
+ }
+ },
+ %endfor
+ }
+ },
+%endfor
+};