Add xml formatting code

Signed-off-by: Karol Gugala <kgugala@antmicro.com>
diff --git a/v2x/vlog_to_model.py b/v2x/vlog_to_model.py
index 4280d0d..91fc0e0 100755
--- a/v2x/vlog_to_model.py
+++ b/v2x/vlog_to_model.py
@@ -26,7 +26,7 @@
 from .yosys import run
 from .yosys.json import YosysJSON
 
-from .lib import xmlinc
+from .xml import xmlinc
 
 
 def is_clock_assoc(infiles, module, clk, port, direction):
diff --git a/v2x/vlog_to_pbtype.py b/v2x/vlog_to_pbtype.py
index 9cb7a6c..b43fd50 100755
--- a/v2x/vlog_to_pbtype.py
+++ b/v2x/vlog_to_pbtype.py
@@ -62,7 +62,7 @@
 from .yosys import run
 from .yosys.json import YosysJSON
 
-from .lib import xmlinc  # noqa: E402
+from .xml import xmlinc  # noqa: E402
 
 
 def normalize_pb_name(pb_name):
diff --git a/v2x/xml/xmlinc.py b/v2x/xml/xmlinc.py
new file mode 100644
index 0000000..b611534
--- /dev/null
+++ b/v2x/xml/xmlinc.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python3
+import lxml.etree as ET
+import os
+
+xi_url = "http://www.w3.org/2001/XInclude"
+
+xi_include = "{{{}}}include".format(xi_url)
+
+ET.register_namespace('xi', xi_url)
+
+
+def make_relhref(outfile, href):
+    outpath = os.path.dirname(os.path.abspath(outfile))
+    relpath = os.path.relpath(os.path.dirname(os.path.abspath(href)), outpath)
+    return os.path.join(relpath, os.path.basename(href))
+
+
+def include_xml(parent, href, outfile, xptr=None):
+    """
+    Generate an XML include, using a relative path.
+
+    Inputs
+    ------
+    parent : XML element to insert include into
+    href : path to included file
+    outfile : path to output file, for relative path generation
+    xptr : optional value for xpointer attribute
+    """
+    xattrs = {'href': make_relhref(outfile, href)}
+    if xptr is not None:
+        xattrs["xpointer"] = xptr
+    return ET.SubElement(parent, xi_include, xattrs)