py_loxi: support/resolve enum members of structs
diff --git a/py_gen/oftype.py b/py_gen/oftype.py
index 2399266..a6620ab 100644
--- a/py_gen/oftype.py
+++ b/py_gen/oftype.py
@@ -27,6 +27,9 @@
 
 from collections import namedtuple
 
+import loxi_utils.loxi_utils as loxi_utils
+import of_g
+
 OFTypeData = namedtuple("OFTypeData", ["init", "pack", "unpack"])
 
 # Map from LOXI type name to an object with templates for init, pack, and unpack
@@ -206,9 +209,12 @@
 
 ## Public interface
 
+def lookup_type_data(oftype, version):
+    return type_data_map.get(loxi_utils.lookup_ir_wiretype(oftype, version))
+
 # Return an initializer expression for the given oftype
-def gen_init_expr(oftype):
-    type_data = type_data_map.get(oftype)
+def gen_init_expr(oftype, version):
+    type_data = lookup_type_data(oftype, version)
     if type_data and type_data.init:
         return type_data.init
     else:
@@ -218,8 +224,8 @@
 #
 # 'value_expr' is a string of Python code which will evaluate to
 # the value to be packed.
-def gen_pack_expr(oftype, value_expr):
-    type_data = type_data_map.get(oftype)
+def gen_pack_expr(oftype, value_expr, version):
+    type_data = lookup_type_data(oftype, version)
     if type_data and type_data.pack:
         return type_data.pack % value_expr
     else:
@@ -229,8 +235,8 @@
 #
 # 'reader_expr' is a string of Python code which will evaluate to
 # the OFReader instance used for deserialization.
-def gen_unpack_expr(oftype, reader_expr):
-    type_data = type_data_map.get(oftype)
+def gen_unpack_expr(oftype, reader_expr, version):
+    type_data = lookup_type_data(oftype, version)
     if type_data and type_data.unpack:
         return type_data.unpack % reader_expr
     else:
diff --git a/py_gen/templates/_ofclass.py b/py_gen/templates/_ofclass.py
index ec6b04e..695cce6 100644
--- a/py_gen/templates/_ofclass.py
+++ b/py_gen/templates/_ofclass.py
@@ -11,7 +11,7 @@
         if ${m.name} != None:
             self.${m.name} = ${m.name}
         else:
-            self.${m.name} = ${py_gen.oftype.gen_init_expr(m.oftype)}
+            self.${m.name} = ${py_gen.oftype.gen_init_expr(m.oftype, version=version)}
 :: #endfor
         return
 
diff --git a/py_gen/templates/_pack.py b/py_gen/templates/_pack.py
index 9956cf6..0525ef2 100644
--- a/py_gen/templates/_pack.py
+++ b/py_gen/templates/_pack.py
@@ -37,19 +37,19 @@
 ::     if type(m) == OFLengthMember:
 ::         length_member = m
 ::         length_member_index = index
-        packed.append(${gen_pack_expr(m.oftype, '0')}) # placeholder for ${m.name} at index ${index}
+        packed.append(${gen_pack_expr(m.oftype, '0', version=version)}) # placeholder for ${m.name} at index ${index}
 ::     elif type(m) == OFFieldLengthMember:
 ::         field_length_members[m.field_name] = m
 ::         field_length_indexes[m.field_name] = index
-        packed.append(${gen_pack_expr(m.oftype, '0')}) # placeholder for ${m.name} at index ${index}
+        packed.append(${gen_pack_expr(m.oftype, '0', version=version)}) # placeholder for ${m.name} at index ${index}
 ::     elif type(m) == OFPadMember:
         packed.append('\x00' * ${m.length})
 ::     else:
-        packed.append(${gen_pack_expr(m.oftype, 'self.' + m.name)})
+        packed.append(${gen_pack_expr(m.oftype, 'self.' + m.name, version=version)})
 ::         if m.name in field_length_members:
 ::             field_length_member = field_length_members[m.name]
 ::             field_length_index = field_length_indexes[m.name]
-        packed[${field_length_index}] = ${gen_pack_expr(field_length_member.oftype, 'len(packed[-1])')}
+        packed[${field_length_index}] = ${gen_pack_expr(field_length_member.oftype, 'len(packed[-1])', version=version)}
 ::         #endif
 ::     #endif
 ::     index += 1
@@ -60,7 +60,7 @@
         packed.append(loxi.generic_util.pad_to(8, length))
         length += len(packed[-1])
 :: #endif
-        packed[${length_member_index}] = ${gen_pack_expr(length_member.oftype, 'length')}
+        packed[${length_member_index}] = ${gen_pack_expr(length_member.oftype, 'length', version=version)}
 :: #endif
 :: if ofclass.has_external_alignment:
         packed.append(loxi.generic_util.pad_to(8, length))
diff --git a/py_gen/templates/_pretty_print.py b/py_gen/templates/_pretty_print.py
index ed9d5cc..74e6d79 100644
--- a/py_gen/templates/_pretty_print.py
+++ b/py_gen/templates/_pretty_print.py
@@ -24,6 +24,7 @@
 :: # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 :: # EPL for the specific language governing permissions and limitations
 :: # under the EPL.
+:: import loxi_utils.loxi_utils as loxi_utils
 ::
         q.text("${ofclass.pyname} {")
         with q.group():
@@ -52,7 +53,7 @@
                 q.text(util.pretty_wildcards(self.${m.name}))
 :: elif m.oftype == 'of_port_no_t':
                 q.text(util.pretty_port(self.${m.name}))
-:: elif m.oftype.startswith("uint"):
+:: elif loxi_utils.lookup_ir_wiretype(m.oftype, version=version).startswith("uint"):
                 q.text("%#x" % self.${m.name})
 :: else:
                 q.pp(self.${m.name})
diff --git a/py_gen/templates/_unpack.py b/py_gen/templates/_unpack.py
index 09a0e08..81efb21 100644
--- a/py_gen/templates/_unpack.py
+++ b/py_gen/templates/_unpack.py
@@ -37,12 +37,12 @@
 ::     if type(m) == OFPadMember:
         reader.skip(${m.length})
 ::     elif type(m) == OFLengthMember:
-        _${m.name} = ${gen_unpack_expr(m.oftype, 'reader')}
+        _${m.name} = ${gen_unpack_expr(m.oftype, 'reader', version=version)}
 ::     elif type(m) == OFFieldLengthMember:
 ::         field_length_members[m.field_name] = m
-        _${m.name} = ${gen_unpack_expr(m.oftype, 'reader')}
+        _${m.name} = ${gen_unpack_expr(m.oftype, 'reader', version=version)}
 ::     elif type(m) == OFTypeMember:
-        _${m.name} = ${gen_unpack_expr(m.oftype, 'reader')}
+        _${m.name} = ${gen_unpack_expr(m.oftype, 'reader', version=version)}
         assert(_${m.name} == ${m.value})
 ::     elif type(m) == OFDataMember:
 ::         if m.name in field_length_members:
@@ -50,7 +50,7 @@
 ::         else:
 ::             reader_expr = 'reader'
 ::         #endif
-        obj.${m.name} = ${gen_unpack_expr(m.oftype, reader_expr)}
+        obj.${m.name} = ${gen_unpack_expr(m.oftype, reader_expr, version=version)}
 ::     #endif
 :: #endfor
 :: if ofclass.has_external_alignment or ofclass.has_internal_alignment:
diff --git a/py_gen/templates/message.py b/py_gen/templates/message.py
index 7158545..4ec8c46 100644
--- a/py_gen/templates/message.py
+++ b/py_gen/templates/message.py
@@ -67,19 +67,19 @@
         if ${m.name} != None:
             self.${m.name} = ${m.name}
         else:
-            self.${m.name} = ${py_gen.oftype.gen_init_expr(m.oftype)}
+            self.${m.name} = ${py_gen.oftype.gen_init_expr(m.oftype, version=version)}
 :: #endfor
 
     def pack(self):
         packed = []
-:: include('_pack.py', ofclass=ofclass)
+:: include('_pack.py', ofclass=ofclass, version=version)
         return ''.join(packed)
 
     @staticmethod
     def unpack(buf):
         if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
         obj = ${ofclass.pyname}()
-:: include('_unpack.py', ofclass=ofclass)
+:: include('_unpack.py', ofclass=ofclass, version=version)
         return obj
 
     def __eq__(self, other):
diff --git a/py_gen/templates/oxm.py b/py_gen/templates/oxm.py
index 792c277..50eb4bd 100644
--- a/py_gen/templates/oxm.py
+++ b/py_gen/templates/oxm.py
@@ -67,18 +67,18 @@
         if ${m.name} != None:
             self.${m.name} = ${m.name}
         else:
-            self.${m.name} = ${py_gen.oftype.gen_init_expr(m.oftype)}
+            self.${m.name} = ${py_gen.oftype.gen_init_expr(m.oftype, version=version)}
 :: #endfor
 
     def pack(self):
         packed = []
-:: include("_pack.py", ofclass=ofclass)
+:: include("_pack.py", ofclass=ofclass, version=version)
         return ''.join(packed)
 
     @staticmethod
     def unpack(buf):
         obj = ${ofclass.pyname}()
-:: include("_unpack.py", ofclass=ofclass)
+:: include("_unpack.py", ofclass=ofclass, version=version)
         return obj
 
     def __eq__(self, other):