
Here are a few notes about the LOXI processing flow.

Currently there are two pieces of input for each version to be supported.

(1) The original openflow.h header file.  This is parsed to extract
identifiers such as #defines and enum definitions.  These are in the
'canonical' directory.

(2) A specially processed list of structs derived from the original
openflow.h header file.  These are the structs that represent the
protocol on the wire with the following minor modifications:
** ofp_header structures instances are replaced by their contents
** Arrays are replaced with the syntax 'data_type[length] idenitifier'.
** Lists of objects are called out explicitly as 'list(data_type) identifier'
** Match structures are renamed to be version specific
** Each flavors of a flow modify (add, modify, modify strict, delete
and delete strict) are called out as different objects
** Each action type (for instance) is called out as its own type.

Copyright 2012, Big Switch Networks, Inc.

Enumerations/defines give semantic values for two contexts:

* Internal management of objects, for example, the particular values that
indicate a message is an Echo message or an action is an output action.
These values, like the wire format, are generally not of interest to 
the users of LOXI.

* External representation of information. These are values which users of
LOXI need to know about, at least through an identifier.  Examples include
OFP_TCP_PORT, OFP_MAX_TABLE_NAME_LEN or OFPP_MAX.  

In general, processing proceeds by:

(1) Extracting information from each version's input files.

(2) Unifying the information across all versions, allowing the
identification of commonalities and differnces.

(3) Calling the language specific generation routines for each
target file.  The list of files to generate and the map from 
file to generating function is given in the language specific
Python file such as lang_c.py at the top level.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

The code layout is as follows (explanations below):

BigCode/Modules/
    LoxiGen/
        Makefile
        loxigen.py      Entry point executable
        of_g.py         Global variables   
        lang_c.py, ...  Language specific
        loxi_front_end/ Python functions for processing input
        loxi_utils/     General utility functions
        canonical/      openflow.h header files
            openflow.h-<of-version>
        openflow_input/ pre-processed openflow.h input
            structs-<of-version>
        c_gen/          Python functions for C code generation
        c_template/     Template including non-autogen files
        utest/          Simple Python scripts to test functions

For C code generation, the output is placed in the BigCode module format.
First, the C template directory is copied over to a target directory.
Then the automatically generated files are created and placed in the
proper locations in the target directory.  Then the result is tarred
up for overlay onto another location.

To test the code locally, the target file is untarred into a local
directory and a special make file (in c_gen/Makefile.local) is copied
into the local directory.


