summaryrefslogtreecommitdiff
path: root/volk/gen
diff options
context:
space:
mode:
authorJosh Blum2012-04-15 13:56:10 -0700
committerJosh Blum2012-04-19 18:12:55 -0700
commite91983371498cfd87d3f4673d6e5874c9ba03ab9 (patch)
treef5ee468da67f60683f412eaa54762fed48ed5b66 /volk/gen
parentd5f9c571ec02a1847da5b58be96bee92538ab3e1 (diff)
downloadgnuradio-e91983371498cfd87d3f4673d6e5874c9ba03ab9.tar.gz
gnuradio-e91983371498cfd87d3f4673d6e5874c9ba03ab9.tar.bz2
gnuradio-e91983371498cfd87d3f4673d6e5874c9ba03ab9.zip
volk: work on template stuff
Diffstat (limited to 'volk/gen')
-rw-r--r--volk/gen/volk_arch_defs.py70
-rw-r--r--volk/gen/volk_machine_defs.py0
-rw-r--r--volk/gen/volk_tmpl_utils.py51
-rw-r--r--volk/gen/volk_xml_utils.py103
4 files changed, 224 insertions, 0 deletions
diff --git a/volk/gen/volk_arch_defs.py b/volk/gen/volk_arch_defs.py
new file mode 100644
index 000000000..271fc90c7
--- /dev/null
+++ b/volk/gen/volk_arch_defs.py
@@ -0,0 +1,70 @@
+#
+# Copyright 2012 Free Software Foundation, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+import os
+import copy
+
+archs = list()
+
+class arch_class:
+ def __init__(self, **kwargs):
+ for key, cast, failval in (
+ ('name', str, None),
+ ('type', str, None),
+ ('no_test', bool, False),
+ ('val', int, None),
+ ('op', eval, None),
+ ('reg', int, None),
+ ('shift', int, None),
+ ('flag', str, None),
+ ('environment', str, None),
+ ('include', str, None),
+ ('alignment', int, 1),
+ ):
+ try: setattr(self, key, cast(kwargs[key]))
+ except: setattr(self, key, failval)
+ assert(self.name)
+ assert(self.type)
+
+ def __repr__(self): return self.name
+
+def register_arch(**kwargs):
+ arch = arch_class(**kwargs)
+ archs.append(arch)
+ if arch.alignment > 1:
+ kwargs['name'] += '_u'
+ kwargs['alignment'] = 1
+ register_arch(**kwargs)
+
+########################################################################
+# register the arches
+########################################################################
+#TODO skip the XML and put it here
+from xml.dom import minidom
+gendir = os.path.dirname(__file__)
+archs_xml = minidom.parse(os.path.join(gendir, 'archs.xml')).getElementsByTagName('arch')
+for arch_xml in archs_xml:
+ kwargs = dict()
+ for attr in arch_xml.attributes.keys():
+ kwargs[attr] = arch_xml.attributes[attr].value
+ for node in arch_xml.childNodes:
+ try:
+ name = node.tagName
+ val = arch_xml.getElementsByTagName(name)[0].firstChild.data
+ kwargs[name] = val
+ except: pass
+ register_arch(**kwargs)
diff --git a/volk/gen/volk_machine_defs.py b/volk/gen/volk_machine_defs.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/volk/gen/volk_machine_defs.py
diff --git a/volk/gen/volk_tmpl_utils.py b/volk/gen/volk_tmpl_utils.py
new file mode 100644
index 000000000..8b00f2f1f
--- /dev/null
+++ b/volk/gen/volk_tmpl_utils.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+#
+# Copyright 2012 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+import os
+import re
+import volk_arch_defs
+from Cheetah import Template
+
+def __escape_pre_processor(code):
+ out = list()
+ for line in code.splitlines():
+ m = re.match('^(\s*)#(\s*)(\w+)(.*)$', line)
+ if m:
+ p0, p1, fcn, stuff = m.groups()
+ pponly = fcn in ('include', 'define', 'ifdef', 'ifndef', 'endif', 'elif')
+ both = fcn in ('if', 'else')
+ istmpl = '$' in stuff
+ if pponly or (both and not istmpl):
+ line = '%s\\#%s%s%s'%(p0, p1, fcn, stuff)
+ out.append(line)
+ return '\n'.join(out)
+
+def __parse_tmpl(_tmpl, **kwargs):
+ defs = {
+ 'archs': volk_arch_defs.archs,
+ }
+ defs.update(kwargs)
+ _tmpl = __escape_pre_processor(_tmpl)
+ return str(Template.Template(_tmpl, defs))
+
+import sys
+print __parse_tmpl(open(sys.argv[1]).read())
diff --git a/volk/gen/volk_xml_utils.py b/volk/gen/volk_xml_utils.py
new file mode 100644
index 000000000..05c0e1193
--- /dev/null
+++ b/volk/gen/volk_xml_utils.py
@@ -0,0 +1,103 @@
+#
+# Copyright 2012 Free Software Foundation, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+#this would not be necessary if we just skipped the xml part and stored the data in python
+
+import os
+from xml.dom import minidom
+import copy
+
+gendir = os.path.dirname(__file__)
+archs_xml = minidom.parse(os.path.join(gendir, 'archs.xml')).getElementsByTagName('arch')
+machines_xml = minidom.parse(os.path.join(gendir, 'machines.xml')).getElementsByTagName('machine')
+compilers_xml = minidom.parse(os.path.join(gendir, 'compilers.xml')).getElementsByTagName('compiler')
+
+class arch_class:
+ def __init__(self, arch_xml):
+ self.name = arch_xml.attributes['name'].value
+ self.type = arch_xml.attributes['type'].value
+ for key in ('val', 'op', 'reg', 'shift', 'flag', 'environment', 'include', 'alignment'):
+ try: setattr(self, key, arch_xml.getElementsByTagName(key)[0].firstChild.data)
+ except: setattr(self, key, None)
+ if self.alignment is None: self.alignment = 1
+
+ def __repr__(self): return self.name
+
+def get_archs():
+ adict = dict([(a.name, a) for a in map(arch_class, archs_xml)])
+ udict = dict()
+ for name, arch in adict.iteritems():
+ if arch.alignment == 1: continue
+ uarch = copy.deepcopy(arch)
+ uarch.name = arch.name + '_u'
+ uarch.alignment = 1
+ udict[uarch.name] = uarch
+ adict.update(udict)
+ return adict
+
+volk_archs = get_archs()
+
+class machine_class:
+ def __init__(self, name, archlist):
+ self.name = name
+ self.archs = list()
+ for arch_name in archlist:
+ if not arch_name: continue
+ self.archs.append(volk_archs[arch_name])
+ if volk_archs.has_key(arch_name + '_u'):
+ self.archs.append(volk_archs[arch_name + '_u'])
+
+ def __repr__(self): return self.name
+
+def yield_machines(name, archlist):
+ for i, arch_name in enumerate(archlist):
+ if '|' in arch_name:
+ for arch_sub in arch_name.split('|'):
+ for m in yield_machines(name, archlist[:i] + [arch_sub] + archlist[i+1:]):
+ yield m
+ return
+ yield machine_class(name, archlist)
+
+def get_machines():
+ mdict = dict()
+ for machine_xml in machines_xml:
+ name = machine_xml.attributes['name'].value
+ archlist = machine_xml.getElementsByTagName('archs')[0].firstChild.data.split()
+ for machine in yield_machines(name, archlist):
+ mdict[machine.name] = machine
+ return mdict
+
+volk_machines = get_machines()
+
+class compiler_class:
+ def __init__(self, compiler_xml):
+ self.name = compiler_xml.attributes['name'].value
+ self.prefix = compiler_xml.getElementsByTagName('prefix')[0].firstChild.data
+ self._remap = dict()
+ for remap_xml in compiler_xml.getElementsByTagName('remap'):
+ self._remap[remap_xml.attributes['name'].value] = remap_xml.firstChild.data
+
+ def remap(self, option):
+ if not self._remap.has_key(option): return option
+ return self._remap[option]
+
+ def __repr__(self): return self.name
+
+def get_compilers():
+ return dict([(c.name, c) for c in map(compiler_class, compilers_xml)])
+
+volk_compilers = get_compilers()