+{% endif %}
+{%- endfor %}
+''')
+
+irnode_h_template = env.from_string(
+'''/* Warning: automatically generated code */
+
+{%- for node in nodes|isnot('custom_is') %}
+static inline int _is_{{node.name}}(const ir_node *node)
+{
+ assert(node != NULL);
+ return _get_irn_op(node) == op_{{node.name}};
+}
+{%- endfor -%}
+
+{% for node in nodes %}
+#define is_{{node.name}}(node) _is_{{node.name}}(node)
+{%- endfor %}
+
+''')
+
+irnode_template = env.from_string(
+'''/* Warning: automatically generated code */
+{% for node in nodes %}
+int (is_{{node.name}})(const ir_node *node)
+{
+ return _is_{{node.name}}(node);
+}
+{% endfor %}
+
+{%- for node in nodes %}
+{%- for attr in node.attrs|hasnot("noprop") %}
+{{attr.type}} (get_{{node.name}}_{{attr.name}})(const ir_node *node)
+{
+ assert(is_{{node.name}}(node));
+ return node->attr.{{node.attrs_name}}.{{attr.name}};
+}
+
+void (set_{{node.name}}_{{attr.name}})(ir_node *node, {{attr.type}} {{attr.name}})
+{
+ assert(is_{{node.name}}(node));
+ node->attr.{{node.attrs_name}}.{{attr.name}} = {{attr.name}};
+}
+{% endfor -%}
+{% endfor -%}
+
+{%- for node in nodes %}
+{%- for input in node.ins %}
+ir_node *(get_{{node.name}}_{{input[0]}})(const ir_node *node)
+{
+ assert(is_{{node.name}}(node));
+ return get_irn_n(node, n_{{node.name}}_{{input[0]}});
+}
+
+void (set_{{node.name}}_{{input[0]}})(ir_node *node, ir_node *{{input[0]|escape_keywords}})
+{
+ assert(is_{{node.name}}(node));
+ set_irn_n(node, n_{{node.name}}_{{input[0]}}, {{input[0]|escape_keywords}});
+}
+{% endfor %}
+{% endfor %}
+''')
+
+irop_template = env.from_string(
+'''/* Warning: automatically generated code */
+{% for node in nodes %}
+ir_op *op_{{node.name}}; ir_op *get_op_{{node.name}}(void) { return op_{{node.name}}; }
+{%- endfor %}
+
+void init_op(void)
+{
+ {% for node in nodes %}
+ op_{{node.name}} = new_ir_op(
+ {%- filter arguments %}
+ iro_{{node.name}}
+ "{{node.name}}"
+ {{node|pinned}}
+ {{node|flags}}
+ {{node|arity}}
+ {{node|opindex}}
+ {{node|attr_size}}
+ NULL
+ {% endfilter %});
+ {%- if "fragile" in node.flags: %}
+ ir_op_set_fragile_indices(op_{{node.name}}, n_{{node.name}}_mem, pn_{{node.name}}_X_regular, pn_{{node.name}}_X_except);
+ {%- endif -%}
+ {%- endfor %}
+
+ be_init_op();
+}
+
+void finish_op(void)
+{
+ {% for node in nodes %}
+ free_ir_op(op_{{node.name}}); op_{{node.name}} = NULL;
+ {%- endfor %}
+}
+
+''')
+
+nodeops_h_template = env.from_string(
+'''/* Warning: automatically generated code */
+#ifndef FIRM_IR_NODEOPS_H
+#define FIRM_IR_NODEOPS_H
+
+#include "firm_types.h"
+
+#include "begin.h"
+
+/**
+ * @addtogroup ir_node
+ * @{
+ */
+
+{% for node in nodes -%}
+{% if node.ins %}
+/**
+ * Input numbers for {{node.name}} node
+ */
+typedef enum {
+ {%- for input in node.ins %}
+ n_{{node.name}}_{{input[0]}},
+ {%- endfor %}
+ n_{{node.name}}_max = n_{{node.name}}_{{node.ins[-1][0]}}
+} n_{{node.name}};
+{% endif %}
+{% if node.outs %}
+/**
+ * Projection numbers for result of {{node.name}} node (use for Proj nodes)
+ */
+typedef enum {
+ {% for out in node.outs -%}
+ pn_{{node.name}}_{{out[0]}}
+ {%- if out.__len__() > 2 %} = {{out[2]}}{% endif %}, /**< {{out[1]}} */
+ {% endfor -%}
+ pn_{{node.name}}_max = pn_{{node.name}}_{{node.outs[-1][0]}}
+} pn_{{node.name}};
+{% endif %}
+{%- endfor %}
+
+{% for node in nodes %}
+{%- if not node.noconstructor %}
+/**
+ * Construct {{node.name|a_an}} node.
+ *
+ * @param dbgi A pointer to debug information.
+{{ node|blockparameterhelp -}}
+{{ node|nodeparametershelp -}}
+ */
+FIRM_API ir_node *new_rd_{{node.name}}(
+ {%- filter parameters %}
+ dbg_info *dbgi
+ {{node|blockparameter}}
+ {{node|nodeparameters}}
+ {% endfilter %});
+
+/**
+ * Construct {{node.name|a_an}} node.
+ *
+{{ node|blockparameterhelp -}}
+{{ node|nodeparametershelp -}}
+ */
+FIRM_API ir_node *new_r_{{node.name}}(
+ {%- filter parameters %}
+ {{node|blockparameter}}
+ {{node|nodeparameters}}
+ {% endfilter %});
+
+/**
+ * Construct {{node.name|a_an}} node.
+ *
+ * @param dbgi A pointer to debug information.
+{{ node|nodeparametershelp -}}
+ */
+FIRM_API ir_node *new_d_{{node.name}}(
+ {%- filter parameters %}
+ dbg_info *dbgi
+ {{node|nodeparameters}}
+ {% endfilter %});
+
+/**
+ * Construct {{node.name|a_an}} node.
+ *
+{{ node|nodeparametershelp -}}
+ */
+FIRM_API ir_node *new_{{node.name}}(
+ {%- filter parameters %}
+ {{node|nodeparameters}}
+ {% endfilter %});
+{%- endif %}
+{% endfor %}
+
+{% for node in nodes %}
+/** Return true if the node is a {{node.name}} node. */
+FIRM_API int is_{{node.name}}(const ir_node *node);
+{%- endfor %}
+
+{% for node in nodes %}
+{% for input in node.ins -%}
+FIRM_API ir_node *get_{{node.name}}_{{input[0]}}(const ir_node *node);
+FIRM_API void set_{{node.name}}_{{input[0]}}(ir_node *node, ir_node *{{input[0]|escape_keywords}});
+{% endfor -%}
+{% for attr in node.attrs|hasnot("noprop") -%}
+FIRM_API {{attr.type}} get_{{node.name}}_{{attr.name}}(const ir_node *node);
+FIRM_API void set_{{node.name}}_{{attr.name}}(ir_node *node, {{attr.type}} {{attr.name}});
+{% endfor -%}
+{% endfor -%}
+
+/** @} */
+
+#include "end.h"
+
+#endif
+
+''')
+
+opcodes_h_template = env.from_string(
+'''/* Warning: automatically generated code */
+#ifndef FIRM_IR_OPCODES_H
+#define FIRM_IR_OPCODES_H
+
+/** The opcodes of the libFirm predefined operations. */
+typedef enum ir_opcode {
+{%- for node in nodes %}
+ iro_{{node.name}},
+{%- endfor %}
+ iro_First = iro_{{nodes[0].name}},
+ iro_Last = iro_{{nodes[-1].name}},
+
+ beo_First,
+ /* backend specific nodes */
+ beo_Spill = beo_First,
+ beo_Reload,
+ beo_Perm,
+ beo_MemPerm,
+ beo_Copy,
+ beo_Keep,
+ beo_CopyKeep,
+ beo_Call,
+ beo_Return,
+ beo_AddSP,
+ beo_SubSP,
+ beo_IncSP,
+ beo_Start,
+ beo_FrameAddr,
+ /* last backend node number */
+ beo_Last = beo_FrameAddr,
+ iro_MaxOpcode
+} ir_opcode;
+
+{% for node in nodes %}
+FIRM_API ir_op *op_{{node.name}};
+{%- endfor %}
+
+{% for node in nodes %}
+FIRM_API ir_op *get_op_{{node.name}}(void);
+{%- endfor %}
+
+#endif