pyloxi: use LOXI IR for classes
diff --git a/py_gen/templates/_ofclass.py b/py_gen/templates/_ofclass.py
index 8c21bb3..4c5358e 100644
--- a/py_gen/templates/_ofclass.py
+++ b/py_gen/templates/_ofclass.py
@@ -1,5 +1,5 @@
-:: from py_gen.codegen import Member, LengthMember, TypeMember
-:: normal_members = [m for m in ofclass.members if type(m) == Member]
+:: from loxi_ir import *
+:: normal_members = [m for m in ofclass.members if type(m) == OFDataMember]
class ${ofclass.pyname}(${superclass}):
:: for m in ofclass.type_members:
${m.name} = ${m.value}
diff --git a/py_gen/templates/_pack.py b/py_gen/templates/_pack.py
index 0c208f7..9a481b2 100644
--- a/py_gen/templates/_pack.py
+++ b/py_gen/templates/_pack.py
@@ -26,22 +26,22 @@
:: # under the EPL.
::
:: # TODO coalesce format strings
-:: from py_gen.codegen import Member, LengthMember, FieldLengthMember, TypeMember, PadMember
+:: from loxi_ir import *
:: length_member = None
:: length_member_index = None
:: field_length_members = {}
:: field_length_indexes = {}
:: index = 0
:: for m in ofclass.members:
-:: if type(m) == LengthMember:
+:: if type(m) == OFLengthMember:
:: length_member = m
:: length_member_index = index
packed.append(${m.oftype.gen_pack_expr('0')}) # placeholder for ${m.name} at index ${index}
-:: elif type(m) == FieldLengthMember:
+:: elif type(m) == OFFieldLengthMember:
:: field_length_members[m.field_name] = m
:: field_length_indexes[m.field_name] = index
packed.append(${m.oftype.gen_pack_expr('0')}) # placeholder for ${m.name} at index ${index}
-:: elif type(m) == PadMember:
+:: elif type(m) == OFPadMember:
packed.append('\x00' * ${m.length})
:: else:
packed.append(${m.oftype.gen_pack_expr('self.' + m.name)})
diff --git a/py_gen/templates/_pretty_print.py b/py_gen/templates/_pretty_print.py
index 86cb237..0a3a61c 100644
--- a/py_gen/templates/_pretty_print.py
+++ b/py_gen/templates/_pretty_print.py
@@ -29,8 +29,8 @@
with q.group():
with q.indent(2):
q.breakable()
-:: from py_gen.codegen import Member, LengthMember, TypeMember
-:: normal_members = [m for m in ofclass.members if type(m) == Member]
+:: from loxi_ir import *
+:: normal_members = [m for m in ofclass.members if type(m) == OFDataMember]
:: first = True
:: for m in normal_members:
:: if not first:
diff --git a/py_gen/templates/_unpack.py b/py_gen/templates/_unpack.py
index 7f3ce2a..211043e 100644
--- a/py_gen/templates/_unpack.py
+++ b/py_gen/templates/_unpack.py
@@ -26,24 +26,24 @@
:: # under the EPL.
::
:: # TODO coalesce format strings
-:: from py_gen.codegen import Member, LengthMember, FieldLengthMember, TypeMember, PadMember
+:: from loxi_ir import *
if type(buf) == loxi.generic_util.OFReader:
reader = buf
else:
reader = loxi.generic_util.OFReader(buf)
:: field_length_members = {}
:: for m in ofclass.members:
-:: if type(m) == PadMember:
+:: if type(m) == OFPadMember:
reader.skip(${m.length})
-:: elif type(m) == LengthMember:
+:: elif type(m) == OFLengthMember:
_${m.name} = ${m.oftype.gen_unpack_expr('reader')}
-:: elif type(m) == FieldLengthMember:
+:: elif type(m) == OFFieldLengthMember:
:: field_length_members[m.field_name] = m
_${m.name} = ${m.oftype.gen_unpack_expr('reader')}
-:: elif type(m) == TypeMember:
+:: elif type(m) == OFTypeMember:
_${m.name} = ${m.oftype.gen_unpack_expr('reader')}
assert(_${m.name} == ${m.value})
-:: elif type(m) == Member:
+:: elif type(m) == OFDataMember:
:: if m.name in field_length_members:
:: reader_expr = 'reader.slice(_%s)' % field_length_members[m.name].name
:: else:
diff --git a/py_gen/templates/action.py b/py_gen/templates/action.py
index d8f7c80..dccb46e 100644
--- a/py_gen/templates/action.py
+++ b/py_gen/templates/action.py
@@ -27,6 +27,7 @@
::
:: import itertools
:: import of_g
+:: import py_gen.util as util
:: include('_copyright.py')
:: include('_autogen.py')
@@ -76,6 +77,7 @@
:: sort_key = lambda x: x.type_members[0].value
:: msgtype_groups = itertools.groupby(sorted(ofclasses, key=sort_key), sort_key)
:: for (k, v) in msgtype_groups:
+:: k = util.constant_for_value(version, "ofp_action_type", k)
:: v = list(v)
:: if len(v) == 1:
${k} : ${v[0].pyname}.unpack,
@@ -85,7 +87,7 @@
:: #endfor
}
-:: experimenter_ofclasses = [x for x in ofclasses if x.type_members[0].value == 'const.OFPAT_VENDOR']
+:: experimenter_ofclasses = [x for x in ofclasses if x.type_members[0].value == 0xffff]
:: sort_key = lambda x: x.type_members[1].value
:: experimenter_ofclasses.sort(key=sort_key)
:: grouped = itertools.groupby(experimenter_ofclasses, sort_key)
diff --git a/py_gen/templates/instruction.py b/py_gen/templates/instruction.py
index bfa0628..88b0f89 100644
--- a/py_gen/templates/instruction.py
+++ b/py_gen/templates/instruction.py
@@ -27,6 +27,7 @@
::
:: import itertools
:: import of_g
+:: import py_gen.util as util
:: include('_copyright.py')
:: include('_autogen.py')
@@ -58,6 +59,7 @@
:: sort_key = lambda x: x.type_members[0].value
:: msgtype_groups = itertools.groupby(sorted(ofclasses, key=sort_key), sort_key)
:: for (k, v) in msgtype_groups:
+:: k = util.constant_for_value(version, "ofp_instruction_type", k)
:: v = list(v)
:: if len(v) == 1:
${k} : ${v[0].pyname}.unpack,
diff --git a/py_gen/templates/message.py b/py_gen/templates/message.py
index 8e2f861..ffad6cf 100644
--- a/py_gen/templates/message.py
+++ b/py_gen/templates/message.py
@@ -27,6 +27,7 @@
::
:: import itertools
:: import of_g
+:: import py_gen.util as util
:: include('_copyright.py')
:: include('_autogen.py')
@@ -51,9 +52,9 @@
xid = None
:: for ofclass in ofclasses:
-:: from py_gen.codegen import Member, LengthMember, TypeMember
-:: normal_members = [m for m in ofclass.members if type(m) == Member]
-:: type_members = [m for m in ofclass.members if type(m) == TypeMember]
+:: from loxi_ir import *
+:: normal_members = [m for m in ofclass.members if type(m) == OFDataMember]
+:: type_members = [m for m in ofclass.members if type(m) == OFTypeMember]
class ${ofclass.pyname}(Message):
:: for m in type_members:
${m.name} = ${m.value}
@@ -193,6 +194,7 @@
:: sort_key = lambda x: x.type_members[1].value
:: msgtype_groups = itertools.groupby(sorted(ofclasses, key=sort_key), sort_key)
:: for (k, v) in msgtype_groups:
+:: k = util.constant_for_value(version, "ofp_type", k)
:: v = list(v)
:: if len(v) == 1:
${k} : ${v[0].pyname}.unpack,
@@ -256,7 +258,7 @@
# TODO OF 1.3 multipart messages
:: #endif
-:: experimenter_ofclasses = [x for x in ofclasses if x.type_members[1].value == 'const.OFPT_VENDOR']
+:: experimenter_ofclasses = [x for x in ofclasses if x.type_members[1].value == 4]
:: sort_key = lambda x: x.type_members[2].value
:: experimenter_ofclasses.sort(key=sort_key)
:: grouped = itertools.groupby(experimenter_ofclasses, sort_key)
diff --git a/py_gen/templates/meter_band.py b/py_gen/templates/meter_band.py
index ca111d5..eeb9ff2 100644
--- a/py_gen/templates/meter_band.py
+++ b/py_gen/templates/meter_band.py
@@ -27,6 +27,7 @@
::
:: import itertools
:: import of_g
+:: import py_gen.util as util
:: include('_copyright.py')
:: include('_autogen.py')
@@ -57,6 +58,7 @@
:: sort_key = lambda x: x.type_members[0].value
:: msgtype_groups = itertools.groupby(sorted(ofclasses, key=sort_key), sort_key)
:: for (k, v) in msgtype_groups:
+:: k = util.constant_for_value(version, "ofp_meter_band_type", k)
:: v = list(v)
:: if len(v) == 1:
${k} : ${v[0].pyname}.unpack,
diff --git a/py_gen/templates/oxm.py b/py_gen/templates/oxm.py
index e11a0a4..2a10a5f 100644
--- a/py_gen/templates/oxm.py
+++ b/py_gen/templates/oxm.py
@@ -52,9 +52,9 @@
pass
:: for ofclass in ofclasses:
-:: from py_gen.codegen import Member, LengthMember, TypeMember
-:: normal_members = [m for m in ofclass.members if type(m) == Member]
-:: type_members = [m for m in ofclass.members if type(m) == TypeMember]
+:: from loxi_ir import *
+:: normal_members = [m for m in ofclass.members if type(m) == OFDataMember]
+:: type_members = [m for m in ofclass.members if type(m) == OFTypeMember]
class ${ofclass.pyname}(OXM):
:: for m in type_members:
${m.name} = ${m.value}
@@ -99,7 +99,7 @@
:: #endfor
parsers = {
-:: key = lambda x: int(x.type_members[0].value, 16)
+:: key = lambda x: x.type_members[0].value
:: for ofclass in sorted(ofclasses, key=key):
${key(ofclass)} : ${ofclass.pyname}.unpack,
:: #endfor