diff options
author | Josh Blum | 2011-04-26 21:55:48 -0700 |
---|---|---|
committer | Josh Blum | 2011-04-26 21:55:48 -0700 |
commit | a5e2d9e5baf869ae961fbb5820447290d6d9c7c8 (patch) | |
tree | 41ced4de13a41dd7b05a4e08d1a730cf0f079f7c /volk/gen | |
parent | d941ba31677804fe382d76fca17fc044d12777f5 (diff) | |
download | gnuradio-a5e2d9e5baf869ae961fbb5820447290d6d9c7c8.tar.gz gnuradio-a5e2d9e5baf869ae961fbb5820447290d6d9c7c8.tar.bz2 gnuradio-a5e2d9e5baf869ae961fbb5820447290d6d9c7c8.zip |
volk: reorganization of generation sources and generated files
All generation sources have been moved to the gen/ subdirectory.
Bootstrap and volk_register.py generate the files into to gen/ subdirectory
in an effort to cleanly separate the static/generated parts of the build tree.
Define top_gendir in Makefile.common, all generated sources listed in Makefile.ams
are prefixed with $(top_gendir) to differentiate them from static in-tree sources.
Diffstat (limited to 'volk/gen')
-rw-r--r-- | volk/gen/.gitignore | 3 | ||||
-rw-r--r-- | volk/gen/archs.xml | 137 | ||||
-rw-r--r-- | volk/gen/emit_omnilog.py | 13 | ||||
-rw-r--r-- | volk/gen/machines.xml | 49 | ||||
-rw-r--r-- | volk/gen/make_c.py | 100 | ||||
-rw-r--r-- | volk/gen/make_config_fixed.py | 21 | ||||
-rw-r--r-- | volk/gen/make_config_in.py | 13 | ||||
-rw-r--r-- | volk/gen/make_cpuid_c.py | 184 | ||||
-rw-r--r-- | volk/gen/make_cpuid_h.py | 48 | ||||
-rw-r--r-- | volk/gen/make_each_machine_c.py | 82 | ||||
-rw-r--r-- | volk/gen/make_environment_init_c.py | 32 | ||||
-rw-r--r-- | volk/gen/make_environment_init_h.py | 18 | ||||
-rw-r--r-- | volk/gen/make_h.py | 39 | ||||
-rw-r--r-- | volk/gen/make_machines_c.py | 57 | ||||
-rw-r--r-- | volk/gen/make_machines_h.py | 50 | ||||
-rw-r--r-- | volk/gen/make_makefile_am.py | 119 | ||||
-rw-r--r-- | volk/gen/make_proccpu_sim.py | 47 | ||||
-rw-r--r-- | volk/gen/make_registry.py | 85 | ||||
-rw-r--r-- | volk/gen/make_set_simd.py | 166 | ||||
-rw-r--r-- | volk/gen/make_typedefs.py | 23 | ||||
-rw-r--r-- | volk/gen/volk_regexp.py | 14 | ||||
-rwxr-xr-x | volk/gen/volk_register.py | 305 |
22 files changed, 1605 insertions, 0 deletions
diff --git a/volk/gen/.gitignore b/volk/gen/.gitignore new file mode 100644 index 000000000..a1c468f93 --- /dev/null +++ b/volk/gen/.gitignore @@ -0,0 +1,3 @@ +/config +/include +/lib diff --git a/volk/gen/archs.xml b/volk/gen/archs.xml new file mode 100644 index 000000000..977cc7924 --- /dev/null +++ b/volk/gen/archs.xml @@ -0,0 +1,137 @@ +<!-- archs appear in order of significance for blind, de-facto version ordering --> +<grammar> + +<arch name="generic" type="all"> + <flag>none</flag> +</arch> + +<arch name="altivec" type="powerpc"> + <flag>maltivec</flag> +</arch> + +<arch name="32" type="x86" no_test="true" > + <flag>m32</flag> + <overrule>MD_SUBCPU</overrule> + <overrule_val>x86_64</overrule_val> +</arch> + +<arch name="64" type="x86"> + <op>0x80000001</op> + <reg>d</reg> + <shift>29</shift> + <flag>m64</flag> + <val>1</val> + <overrule>MD_SUBCPU</overrule> + <overrule_val>x86</overrule_val> +</arch> + +<arch name="3dnow" type="x86"> + <op>0x80000001</op> + <reg>d</reg> + <shift>31</shift> + <flag>m3dnow</flag> + <val>1</val> +</arch> + +<arch name="abm" type="x86"> + <val>1</val> + <op>0x80000001</op> + <reg>d</reg> + <shift>5</shift> + <flag>sse4.2</flag> +</arch> + +<arch name="popcount" type="x86"> + <val>1</val> + <op>1</op> + <reg>c</reg> + <shift>23</shift> + <flag>mpopcnt</flag> +</arch> + +<arch name="mmx" type="x86"> + <val>1</val> + <op>1</op> + <reg>d</reg> + <shift>23</shift> + <flag>mmmx</flag> +</arch> + + +<arch name="sse" type="x86"> + <val>1</val> + <op>1</op> + <reg>d</reg> + <shift>25</shift> + <flag>msse</flag> + <environment>_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);</environment> + <include>xmmintrin.h</include> +</arch> + + +<arch name="sse2" type="x86"> + <val>1</val> + <op>1</op> + <reg>d</reg> + <shift>26</shift> + <flag>msse2</flag> +</arch> + +<arch name="orc" type="all"> + <flag>lorc-0.4</flag> + <overrule>LV_HAVE_ORC</overrule> + <overrule_val>no</overrule_val> +</arch> + +<arch name="sse3" type="x86"> + <val>1</val> + <op>1</op> + <reg>c</reg> + <shift>0</shift> + <flag>msse3</flag> + <environment>_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);</environment> + <include>pmmintrin.h</include> +</arch> + +<arch name="ssse3" type="x86"> + <val>1</val> + <op>1</op> + <reg>c</reg> + <shift>9</shift> + <flag>mssse3</flag> +</arch> + +<arch name="sse4_a" type="x86"> + <val>1</val> + <op>0x80000001</op> + <reg>c</reg> + <shift>6</shift> + <flag>msse4a</flag> +</arch> + + +<arch name="sse4_1" type="x86"> + <val>1</val> + <op>1</op> + <reg>c</reg> + <shift>19</shift> + <flag>msse4.1</flag> +</arch> + +<arch name="sse4_2" type="x86"> + <val>1</val> + <op>1</op> + <reg>c</reg> + <shift>20</shift> + <flag>msse4.2</flag> +</arch> + +<arch name="avx" type="x86"> + <val>1</val> + <op>1</op> + <reg>c</reg> + <shift>28</shift> + <flag>mavx</flag> +</arch> + +</grammar> diff --git a/volk/gen/emit_omnilog.py b/volk/gen/emit_omnilog.py new file mode 100644 index 000000000..309d7e578 --- /dev/null +++ b/volk/gen/emit_omnilog.py @@ -0,0 +1,13 @@ +def emit_prolog(): + tempstring = ""; + tempstring = tempstring + '#ifdef __cplusplus\n'; + tempstring = tempstring + 'extern "C" {\n'; + tempstring = tempstring + '#endif\n'; + return tempstring; +def emit_epilog(): + tempstring = ""; + tempstring = tempstring + '#ifdef __cplusplus\n'; + tempstring = tempstring + '}\n'; + tempstring = tempstring + '#endif\n'; + return tempstring; + diff --git a/volk/gen/machines.xml b/volk/gen/machines.xml new file mode 100644 index 000000000..ad71da177 --- /dev/null +++ b/volk/gen/machines.xml @@ -0,0 +1,49 @@ +<grammar> + +<machine name="generic"> +<archs>generic</archs> +</machine> + +<!-- +<machine name="mmx"> +<archs>generic 32|64 mmx</archs> +</machine> + +<machine name="sse"> +<archs>generic 32|64 mmx sse</archs> +</machine> +--> + +<machine name="sse2"> +<archs>generic 32|64 mmx sse sse2</archs> +</machine> + +<machine name="sse3"> +<archs>generic 32|64 mmx sse sse2 sse3</archs> +</machine> + +<machine name="ssse3"> +<archs>generic 32|64 mmx sse sse2 sse3 ssse3</archs> +</machine> + +<machine name="sse4_a"> +<archs>generic 32|64 mmx sse sse2 sse3 sse4_a popcount</archs> +</machine> + +<machine name="sse4_1"> +<archs>generic 32|64 mmx sse sse2 sse3 ssse3 sse4_1</archs> +</machine> + +<machine name="sse4_2"> +<archs>generic 32|64 mmx sse sse2 sse3 ssse3 sse4_2 popcount</archs> +</machine> + +<machine name="avx"> +<archs>generic 32|64 mmx sse sse2 sse3 ssse3 sse4_2 popcount avx</archs> +</machine> + +<machine name="altivec"> +<archs>generic altivec</archs> +</machine> + +</grammar> diff --git a/volk/gen/make_c.py b/volk/gen/make_c.py new file mode 100644 index 000000000..591e8b64c --- /dev/null +++ b/volk/gen/make_c.py @@ -0,0 +1,100 @@ +# +# Copyright 2010 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/>. +# + +from volk_regexp import * +import string +from emit_omnilog import * + +#ok todo list: +#put n_archs into the info struct so it doesn't have to be arch_defs[0]. + +def make_c(machines, archs, functions, arched_arglist, my_arglist): + tempstring = r""" +// This file is automatically generated by make_c.py. +// Do not edit this file. +""" + tempstring += """ +#include <volk/volk_common.h> +#include <volk/volk_machines.h> +#include <volk/volk_registry.h> +#include <volk/volk_typedefs.h> +#include <volk/volk_cpu.h> +#include "volk_rank_archs.h" +#include <volk/volk.h> +#include <stdio.h> +#include <string.h> + +""" + tempstring += emit_prolog(); + +#OK here's the deal. the .h prototypes the functions. the .c impls them as fptrs, can use p_whatever. +#also .c impls the get_machine call +#also .c impls the default call for each fn + +#here do static fn get arch + tempstring += r""" +struct volk_machine *get_machine(void) { + extern struct volk_machine volk_machines[]; + extern unsigned int n_volk_machines; + static struct volk_machine *machine = NULL; + + if(machine != NULL) return machine; + else { + unsigned int max_score = 0; + int i; + for(i=0; i<n_volk_machines; i++) { + if(!(volk_machines[i].caps & (~volk_get_lvarch()))) { + if(volk_machines[i].caps > max_score) { + max_score = volk_machines[i].caps; + machine = &(volk_machines[i]); + } + } + } + printf("Using Volk machine: %s\n", machine->name); + return machine; + } +} + +static unsigned int get_index(const char *indices[], unsigned int n_archs, const char *arch_name) { + int i; + for(i=0; i<n_archs; i++) { + if(!strncmp(indices[i], arch_name, 20)) { + return i; + } + } + //something terrible should happen here + printf("Volk warning: no arch found, returning generic impl\n"); + return get_index(indices, n_archs, "generic"); //but we'll fake it for now +} + +""" + + for i in range(len(functions)): + tempstring += "void get_" + functions[i] + replace_arch.sub("", arched_arglist[i]) + "\n" + tempstring += " %s = get_machine()->%s_archs[volk_rank_archs(get_machine()->%s_desc.arch_defs, get_machine()->%s_desc.n_archs, volk_get_lvarch())];\n" % (functions[i], functions[i], functions[i], functions[i]) + tempstring += " %s(%s);\n}\n\n" % (functions[i], my_arglist[i]) + tempstring += replace_volk.sub("p", functions[i]) + " " + functions[i] + " = &get_" + functions[i] + ";\n\n" + tempstring += "void %s_manual%s\n" % (functions[i], arched_arglist[i]) + tempstring += " get_machine()->%s_archs[get_index(get_machine()->%s_desc.indices, get_machine()->%s_desc.n_archs, arch)](%s);\n}\n" % (functions[i], functions[i], functions[i], my_arglist[i]) + tempstring += "struct volk_func_desc %s_get_func_desc(void) {\n" % (functions[i]) + tempstring += " return get_machine()->%s_desc;\n}\n" % (functions[i]) + + tempstring += emit_epilog(); + + return tempstring + + diff --git a/volk/gen/make_config_fixed.py b/volk/gen/make_config_fixed.py new file mode 100644 index 000000000..3fd1bdf0a --- /dev/null +++ b/volk/gen/make_config_fixed.py @@ -0,0 +1,21 @@ +from xml.dom import minidom + +def make_config_fixed(dom) : + tempstring = ""; + tempstring = tempstring +'/*this file is auto generated by volk_register.py*/'; + tempstring = tempstring + '\n#ifndef INCLUDED_VOLK_CONFIG_FIXED_H'; + tempstring = tempstring + '\n#define INCLUDED_VOLK_CONFIG_FIXED_H'; + tempstring = tempstring + '\n\n'; + enum_counter = 0; + for domarch in dom: + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + '#define LV_' + arch.swapcase() + " " + str(enum_counter) + '\n'; + enum_counter = enum_counter + 1; + tempstring = tempstring + '\n\n'; + + tempstring = tempstring + "#endif /*INCLUDED_VOLK_CONFIG_FIXED*/\n" + + return tempstring; + + + diff --git a/volk/gen/make_config_in.py b/volk/gen/make_config_in.py new file mode 100644 index 000000000..d29680af2 --- /dev/null +++ b/volk/gen/make_config_in.py @@ -0,0 +1,13 @@ +from xml.dom import minidom + +def make_config_in(dom) : + tempstring = ""; + tempstring = tempstring +'/*this file is auto generated by volk_register.py*/'; + tempstring = tempstring + '\n\n'; + + for domarch in dom: + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + '#undef LV_HAVE_' + arch.swapcase() + '\n'; + tempstring = tempstring + '\n'; + + return tempstring diff --git a/volk/gen/make_cpuid_c.py b/volk/gen/make_cpuid_c.py new file mode 100644 index 000000000..20621769b --- /dev/null +++ b/volk/gen/make_cpuid_c.py @@ -0,0 +1,184 @@ +#!/usr/bin/env python +# +# Copyright 2011 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. +# + +from xml.dom import minidom + +HEADER_TEMPL = """\ +/*this file is auto_generated by volk_register.py*/ + +#include <volk/volk_cpu.h> +#include <volk/volk_config_fixed.h> + +struct VOLK_CPU volk_cpu; + +#if defined(__i386__) || (__x86_64__) +#include <gcc_x86_cpuid.h> +#define cpuid_x86(op, r) __get_cpuid(op, r+0, r+1, r+2, r+3) + +static inline unsigned int cpuid_eax(unsigned int op) { + unsigned int regs[4]; + cpuid_x86 (op, regs); + return regs[0]; +} + +static inline unsigned int cpuid_ebx(unsigned int op) { + unsigned int regs[4]; + cpuid_x86 (op, regs); + return regs[1]; +} + +static inline unsigned int cpuid_ecx(unsigned int op) { + unsigned int regs[4]; + cpuid_x86 (op, regs); + return regs[2]; +} + +static inline unsigned int cpuid_edx(unsigned int op) { + unsigned int regs[4]; + cpuid_x86 (op, regs); + return regs[3]; +} +#endif + +""" + +def make_cpuid_c(dom) : + tempstring = HEADER_TEMPL; + + for domarch in dom: + if str(domarch.attributes["type"].value) == "x86": + if "no_test" in domarch.attributes.keys(): + no_test = str(domarch.attributes["no_test"].value); + if no_test == "true": + no_test = True; + else: + no_test = False; + else: + no_test = False; + arch = str(domarch.attributes["name"].value); + op = domarch.getElementsByTagName("op"); + if op: + op = str(op[0].firstChild.data); + reg = domarch.getElementsByTagName("reg"); + if reg: + reg = str(reg[0].firstChild.data); + shift = domarch.getElementsByTagName("shift"); + if shift: + shift = str(shift[0].firstChild.data); + val = domarch.getElementsByTagName("val"); + if val: + val = str(val[0].firstChild.data); + + if no_test: + tempstring = tempstring + """\ +int i_can_has_%s () { +#if defined(__i386__) || (__x86_64__) + return 1; +#else + return 0; +#endif +} + +""" % (arch) + + elif op == "1": + tempstring = tempstring + """\ +int i_can_has_%s () { +#if defined(__i386__) || (__x86_64__) + unsigned int e%sx = cpuid_e%sx (%s); + return ((e%sx >> %s) & 1) == %s; +#else + return 0; +#endif +} + +""" % (arch, reg, reg, op, reg, shift, val) + + elif op == "0x80000001": + tempstring = tempstring + """\ +int i_can_has_%s () { +#if defined(__i386__) || (__x86_64__) + unsigned int extended_fct_count = cpuid_eax(0x80000000); + if (extended_fct_count < 0x80000001) + return %s^1; + unsigned int extended_features = cpuid_e%sx (%s); + return ((extended_features >> %s) & 1) == %s; +#else + return 0; +#endif +} + +""" % (arch, val, reg, op, shift, val) + + elif str(domarch.attributes["type"].value) == "powerpc": + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + """\ +int i_can_has_%s () { +#ifdef __PPC__ + return 1; +#else + return 0; +#endif +} + +""" % (arch) + + elif str(domarch.attributes["type"].value) == "all": + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + """\ +int i_can_has_%s () { + return 1; +} + +""" % (arch) + else: + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + """\ +int i_can_has_%s () { + return 0; +} + +""" % (arch) + + tempstring = tempstring + "void volk_cpu_init() {\n"; + for domarch in dom: + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + " volk_cpu.has_" + arch + " = &i_can_has_" + arch + ";\n" + tempstring = tempstring + "}\n\n" + + tempstring = tempstring + "unsigned int volk_get_lvarch() {\n"; + tempstring = tempstring + " unsigned int retval = 0;\n" + tempstring = tempstring + " volk_cpu_init();\n" + for domarch in dom: + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + " retval += volk_cpu.has_" + arch + "() << LV_" + arch.swapcase() + ";\n" + tempstring = tempstring + " return retval;\n" + tempstring = tempstring + "}\n\n" + + return tempstring; + + + + + + + diff --git a/volk/gen/make_cpuid_h.py b/volk/gen/make_cpuid_h.py new file mode 100644 index 000000000..cd3da2455 --- /dev/null +++ b/volk/gen/make_cpuid_h.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# +# Copyright 2011 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. +# + +from xml.dom import minidom +from emit_omnilog import * + +def make_cpuid_h(dom) : + tempstring = ""; + tempstring = tempstring +'/*this file is auto generated by volk_register.py*/'; + tempstring = tempstring +'\n#ifndef INCLUDED_VOLK_CPU_H'; + tempstring = tempstring +'\n#define INCLUDED_VOLK_CPU_H\n\n'; + tempstring = tempstring + emit_prolog(); + tempstring = tempstring + '\n' + + tempstring = tempstring + "struct VOLK_CPU {\n" + for domarch in dom: + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + " int (*has_" + arch + ") ();\n"; + tempstring = tempstring + "};\n\n"; + tempstring = tempstring + "extern struct VOLK_CPU volk_cpu;\n\n"; + + tempstring = tempstring + "void volk_cpu_init ();\n" + tempstring = tempstring + "unsigned int volk_get_lvarch ();\n" + + tempstring = tempstring + "\n"; + tempstring = tempstring + emit_epilog(); + tempstring = tempstring + "#endif /*INCLUDED_VOLK_CPU_H*/\n" + + return tempstring; diff --git a/volk/gen/make_each_machine_c.py b/volk/gen/make_each_machine_c.py new file mode 100644 index 000000000..94d6d7789 --- /dev/null +++ b/volk/gen/make_each_machine_c.py @@ -0,0 +1,82 @@ +# +# Copyright 2010 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/>. +# + +from volk_regexp import * +import string +from emit_omnilog import * + +#ok todo list: +#put n_archs into the info struct so it doesn't have to be arch_defs[0]. + +def make_each_machine_c(machine_name, archs, functions, fcountlist, taglist): + tempstring = r""" +// This file is automatically generated by make_each_machine_c.py. +// Do not edit this file. +""" + for arch in archs: + tempstring += "#define LV_HAVE_" + arch.swapcase() + " 1\n" + + tempstring += """ +#include <volk/volk_common.h> +#include <volk/volk_machines.h> +#include <volk/volk_registry.h> + +""" + tempstring += emit_prolog(); + for func in functions: + tempstring += "#include <volk/" + func + ".h>\n" + tempstring += "\n\n" + + for i in range(len(functions)): + tempstring += "static const " + replace_volk.sub("p", functions[i]) + " " + functions[i] + "_archs[] = {\n" + + tags_counter = 0 + for arch_list in fcountlist[i]: + tempstring += "#if " + for arch in arch_list: + tempstring += "defined(LV_HAVE_" + arch + ") && " + tempstring = strip_trailing(tempstring, " && ") + tempstring += "\n " + functions[i] + "_" + str(taglist[i][tags_counter]) + ",\n" + tempstring += "#endif\n" + tags_counter += 1 + + tempstring = strip_trailing(tempstring, ",") + tempstring += "};\n\n" + + + tempstring += "static unsigned int caps = " + for arch in archs: + tempstring += "(1 << LV_" + arch.swapcase() + ") + " + tempstring = strip_trailing(tempstring, " + ") + tempstring += ";\n" + + tempstring += "static const char* name = \"" + machine_name + "\";\n" + tempstring += "struct volk_machine volk_machine_" + machine_name + " = {\n" + tempstring += " caps,\n" + tempstring += " name,\n" + + for i in range(len(functions)): + tempstring += " { " + functions[i] + "_indices, " + functions[i] + "_arch_defs, " + functions[i] + "_n_archs },\n" + tempstring += " " + functions[i] + "_archs,\n" + + tempstring = strip_trailing(tempstring, ",") + tempstring += "};\n" + tempstring += emit_epilog(); + + return tempstring + + diff --git a/volk/gen/make_environment_init_c.py b/volk/gen/make_environment_init_c.py new file mode 100644 index 000000000..263d5bcd1 --- /dev/null +++ b/volk/gen/make_environment_init_c.py @@ -0,0 +1,32 @@ +from xml.dom import minidom + +def make_environment_init_c(dom) : + tempstring = ""; + tempstring = tempstring + "/*this file is auto_generated by volk_register.py*/\n\n"; + tempstring = tempstring + "#include<volk/volk_environment_init.h>\n" + for domarch in dom: + arch = str(domarch.attributes["name"].value); + incs = domarch.getElementsByTagName("include"); + for inc in incs: + my_inc = str(inc.firstChild.data); + tempstring = tempstring + "#ifdef LV_HAVE_" + arch.swapcase() + "\n"; + tempstring = tempstring + "#include<" + my_inc + ">\n"; + tempstring = tempstring + "#endif\n" + tempstring = tempstring + '\n\n'; + tempstring = tempstring + "void volk_environment_init(){\n" + + for domarch in dom: + arch = str(domarch.attributes["name"].value); + envs = domarch.getElementsByTagName("environment"); + for env in envs: + cmd = str(env.firstChild.data); + tempstring = tempstring + "#ifdef LV_HAVE_" + arch.swapcase() + "\n"; + tempstring = tempstring + " " + cmd + "\n"; + tempstring = tempstring + "#endif\n" + + tempstring = tempstring + "}\n"; + return tempstring; + + + + diff --git a/volk/gen/make_environment_init_h.py b/volk/gen/make_environment_init_h.py new file mode 100644 index 000000000..77a841a24 --- /dev/null +++ b/volk/gen/make_environment_init_h.py @@ -0,0 +1,18 @@ +from xml.dom import minidom +from emit_omnilog import * + +def make_environment_init_h() : + tempstring = ""; + tempstring = tempstring + "/*this file is auto_generated by volk_register.py*/\n\n"; + tempstring = tempstring + "#ifndef INCLUDE_LIBVECTOR_ENVIRONMENT_INIT_H\n"; + tempstring = tempstring + "#define INCLUDE_LIBVECTOR_ENVIRONMENT_INIT_H\n"; + tempstring = tempstring + "\n"; + tempstring = tempstring + emit_prolog(); + tempstring = tempstring + "void volk_environment_init();\n"; + tempstring = tempstring + emit_epilog(); + tempstring = tempstring + "#endif\n" + return tempstring; + + + + diff --git a/volk/gen/make_h.py b/volk/gen/make_h.py new file mode 100644 index 000000000..07e62939b --- /dev/null +++ b/volk/gen/make_h.py @@ -0,0 +1,39 @@ +from xml.dom import minidom +from emit_omnilog import * +from volk_regexp import * + +# http://gcc.gnu.org/wiki/Visibility +volk_api_defines = """ +#ifdef volk_EXPORTS +# define VOLK_API __VOLK_ATTR_EXPORT +#else +# define VOLK_API __VOLK_ATTR_IMPORT +#endif +""" + +def make_h(funclist, arched_arglist) : + tempstring = ""; + tempstring = tempstring + '/*this file is auto generated by make_h.py*/\n'; + + tempstring = tempstring + '\n#ifndef INCLUDED_VOLK_RUNTIME'; + tempstring = tempstring + '\n#define INCLUDED_VOLK_RUNTIME'; + tempstring = tempstring + '\n\n#include<volk/volk_typedefs.h>\n'; + tempstring = tempstring + '#include<volk/volk_config_fixed.h>\n'; + tempstring = tempstring + '#include<volk/volk_attributes.h>\n'; + tempstring = tempstring + '#include<volk/volk_complex.h>\n'; + tempstring = tempstring + volk_api_defines + tempstring = tempstring + emit_prolog(); + + tempstring = tempstring + '\n'; + + for i in range(len(funclist)): + tempstring += "extern " + replace_volk.sub("p", funclist[i]) + " " + funclist[i] + ";\n" + tempstring += "extern VOLK_API void %s_manual%s;\n" % (funclist[i], arched_arglist[i]) + tempstring = strip_trailing(tempstring, " {") + tempstring += "extern VOLK_API struct volk_func_desc %s_get_func_desc(void);\n" % (funclist[i]) + + tempstring = tempstring + emit_epilog(); + tempstring = tempstring + "#endif /*INCLUDED_VOLK_RUNTIME*/\n"; + + return tempstring; + diff --git a/volk/gen/make_machines_c.py b/volk/gen/make_machines_c.py new file mode 100644 index 000000000..9ad56fb62 --- /dev/null +++ b/volk/gen/make_machines_c.py @@ -0,0 +1,57 @@ +# +# Copyright 2010 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/>. +# + +from volk_regexp import * + +def make_machines_c(machines): + tempstring = r""" +// This file is automatically generated by make_machines_c.py. +// Do not edit this file. + +#include <volk/volk_common.h> +#include <volk/volk_typedefs.h> +#include <volk/volk_machines.h> + +struct volk_machine volk_machines[] = { +""" + for machine in machines: + tempstring += """#if LV_MACHINE_""" + machine.swapcase() + "\n" + tempstring += "volk_machine_" + machine + tempstring += "," + tempstring += "\n#endif\n" + + tempstring += r""" +}; + +""" + + for machine in machines: + tempstring += "#if LV_MACHINE_" + machine.swapcase() + "\n" + tempstring += "#define LV_MACHINE_" + machine.swapcase() + "_CNT 1\n" + tempstring += "#else\n" + tempstring += "#define LV_MACHINE_" + machine.swapcase() + "_CNT 0\n" + tempstring += "#endif\n" + + tempstring += """unsigned int n_volk_machines = +""" + for machine in machines: + tempstring += "(LV_MACHINE_" + machine.swapcase() + "_CNT) " + tempstring += "+ " + tempstring = tempstring[:-2] + tempstring += ";\n" + + return tempstring diff --git a/volk/gen/make_machines_h.py b/volk/gen/make_machines_h.py new file mode 100644 index 000000000..674ee12cd --- /dev/null +++ b/volk/gen/make_machines_h.py @@ -0,0 +1,50 @@ +# +# Copyright 2010 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/>. +# + +from volk_regexp import * + +def make_machines_h(functions, machines): + tempstring = r""" +// This file is automatically generated by make_machines_h.py. +// Do not edit this file. + +#ifndef INCLUDED_LIBVOLK_MACHINES_H +#define INCLUDED_LIBVOLK_MACHINES_H + +#include <volk/volk_common.h> +#include <volk/volk_typedefs.h> + +struct volk_machine { + const unsigned int caps; //capabilities (i.e., archs compiled into this machine, in the volk_get_lvarch format) + const char *name; +""" + for function in functions: + tempstring += "\n const struct volk_func_desc " + function + "_desc;\n" + tempstring += " const " + replace_volk.sub("p", function) + " *" + function + "_archs;\n" + + tempstring += r"""}; + +""" + for machine in machines: + tempstring += """#if LV_MACHINE_""" + machine.swapcase() + "\n" + tempstring += "extern const struct volk_machine volk_machine_" + machine + ";\n" + tempstring += """#endif\n""" + + tempstring += r""" +#endif //INCLUDED_LIBVOLK_MACHINES_H""" + + return tempstring diff --git a/volk/gen/make_makefile_am.py b/volk/gen/make_makefile_am.py new file mode 100644 index 000000000..0d746ca28 --- /dev/null +++ b/volk/gen/make_makefile_am.py @@ -0,0 +1,119 @@ +# +# Copyright 2010 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/>. +# + +from xml.dom import minidom + +def make_makefile_am(dom, machines, archflags_dict): + tempstring = r""" +# This file is automatically generated by make_makefile_am.py. +# Do not edit this file. + +include $(top_srcdir)/Makefile.common + +AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) \ + -I$(top_gendir)/include \ + -Dvolk_EXPORTS \ + -fvisibility=hidden \ + $(WITH_INCLUDES) + +lib_LTLIBRARIES = \ + libvolk.la + +EXTRA_DIST = \ + volk_rank_archs.h \ + gcc_x86_cpuid.h + +# ---------------------------------------------------------------- +# The main library +# ---------------------------------------------------------------- + +libvolk_la_SOURCES = \ + $(platform_CODE) \ + $(top_gendir)/lib/volk.cc \ + $(top_gendir)/lib/volk_cpu.c \ + volk_rank_archs.c \ + $(top_gendir)/lib/volk_machines.cc + +if LV_HAVE_ORC +volk_orc_CFLAGS = -DLV_HAVE_ORC=1 +volk_orc_LDFLAGS = $(ORC_LDFLAGS) -lorc-0.4 +volk_orc_LIBADD = ../orc/libvolk_orc.la +else +volk_orc_CFLAGS = +volk_orc_LDFLAGS = +volk_orc_LIBADD = +endif + +libvolk_la_CPPFLAGS = $(AM_CPPFLAGS) $(volk_orc_CFLAGS) +libvolk_la_LDFLAGS = $(NO_UNDEFINED) -version-info 0:0:0 $(volk_orc_LDFLAGS) +libvolk_la_LIBADD = $(volk_orc_LIBADD) + +noinst_LTLIBRARIES = + +""" + + #here be dragons + for machine_name in machines: + tempstring += "if LV_MACHINE_" + machine_name.swapcase() + "\n" + tempstring += "libvolk_" + machine_name + "_la_SOURCES = $(top_gendir)/lib/volk_machine_" + machine_name + ".cc\n" + tempstring += "libvolk_" + machine_name + "_la_CPPFLAGS = -I$(top_srcdir)/include -I$(top_gendir)/include $(volk_orc_CFLAGS) " + for arch in machines[machine_name]: + if archflags_dict[arch] != "none": + tempstring += "-" + archflags_dict[arch] + " " + + tempstring += "\nnoinst_LTLIBRARIES += libvolk_" + machine_name + ".la " + tempstring += "\nlibvolk_la_LIBADD += libvolk_" + machine_name + ".la\n" + tempstring += "libvolk_la_CPPFLAGS += -DLV_MACHINE_" + machine_name.swapcase() + " \n" + tempstring += "endif\n" + + + tempstring += r""" + +# ---------------------------------------------------------------- +# The QA library. Note libvolk.la in LIBADD +# ---------------------------------------------------------------- +#libvolk_qa_la_SOURCES = \ +# qa_utils.cc + +#libvolk_qa_la_LDFLAGS = $(NO_UNDEFINED) -version-info 0:0:0 -lboost + +#libvolk_qa_la_LIBADD = \ +# libvolk.la \ +# libvolk_runtime.la + +# ---------------------------------------------------------------- +# headers that don't get installed +# ---------------------------------------------------------------- +noinst_HEADERS = \ + $(top_gendir)/lib/volk_init.h \ + qa_utils.h + +# ---------------------------------------------------------------- +# Our test program +# ---------------------------------------------------------------- +noinst_PROGRAMS = \ + testqa + +testqa_SOURCES = testqa.cc qa_utils.cc +testqa_CPPFLAGS = -DBOOST_TEST_DYN_LINK -DBOOST_TEST_MAIN $(AM_CPPFLAGS) +testqa_LDFLAGS = $(BOOST_UNIT_TEST_FRAMEWORK_LIB) +testqa_LDADD = \ + libvolk.la +""" + + + return tempstring diff --git a/volk/gen/make_proccpu_sim.py b/volk/gen/make_proccpu_sim.py new file mode 100644 index 000000000..029dacfcc --- /dev/null +++ b/volk/gen/make_proccpu_sim.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# +# Copyright 2011 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. +# + +from xml.dom import minidom + +def make_proccpu_sim(dom) : + tempstring = ""; + tempstring = tempstring + "/*this file is auto_generated by volk_register.py*/\n\n"; + tempstring = tempstring + "#include <volk/volk_cpu.h>\n" + tempstring = tempstring + "#include <stdio.h>\n" + tempstring = tempstring + "\n\n" + + tempstring = tempstring + "void test_append(char* buf, int val, char* newkey){\n"; + tempstring = tempstring + " if(val==1){\n"; + tempstring = tempstring + " sprintf(buf, \"%s %s\", buf, newkey);\n"; + tempstring = tempstring + " }\n"; + tempstring = tempstring + "}\n"; + tempstring = tempstring + "\n\n"; + + tempstring = tempstring + "int main() {\n"; + tempstring = tempstring + " volk_cpu_init();\n"; + tempstring = tempstring + " char buf[2048];\n"; + for domarch in dom: + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + " test_append(buf, volk_cpu.has_" + arch + "(), \"" + arch + "\");\n" + tempstring = tempstring + " printf(\"%s\\n\", buf);\n" + tempstring = tempstring + "}\n" + return tempstring; diff --git a/volk/gen/make_registry.py b/volk/gen/make_registry.py new file mode 100644 index 000000000..de1f46aa6 --- /dev/null +++ b/volk/gen/make_registry.py @@ -0,0 +1,85 @@ +from xml.dom import minidom +from emit_omnilog import * +from volk_regexp import * +import string + +def make_registry(dom, funclist, fcountlist, taglist) : + tempstring = ""; + tempstring = tempstring + "/*this file is auto_generated by volk_register.py*/\n\n"; + tempstring = tempstring +'\n#ifndef INCLUDED_VOLK_REGISTRY_H'; + tempstring = tempstring +'\n#define INCLUDED_VOLK_REGISTRY_H\n\n'; + tempstring = tempstring +'#include<volk/volk_config_fixed.h>\n'; + tempstring = tempstring + emit_prolog(); + tempstring = tempstring + '\n' + + + + + for domarch in dom: + arch = str(domarch.attributes["name"].value); + tempstring = tempstring +"#ifdef LV_HAVE_" + arch.swapcase() + "\n"; + tempstring = tempstring +"#define LV_" + arch.swapcase() + "_CNT 1\n"; + tempstring = tempstring +"#else\n"; + tempstring = tempstring +"#define LV_" + arch.swapcase() + "_CNT 0\n"; + tempstring = tempstring +"#endif /*LV_HAVE_" + arch.swapcase() + "*/\n\n"; + + counter = 0; + + for i in range(len(funclist)): + tempstring = tempstring + "static const char* " + funclist[i] + "_indices[] = {\n"; + + tags_counter = 0; + for arch_list in fcountlist[i]: + tempstring = tempstring + "#if defined(LV_HAVE_" + for ind in range(len(arch_list)): + + tempstring = tempstring + arch_list[ind] + ")"; + if ind < len(arch_list) - 1: + tempstring = tempstring + " && defined(LV_HAVE_"; + + tempstring = tempstring + "\n \"" + str(taglist[i][tags_counter]) + "\",\n#endif\n"; + tags_counter = tags_counter + 1; + + tempstring = strip_trailing(tempstring, ",") + tempstring = tempstring + "};\n\n"; + + + for fcount in fcountlist: + tempstring = tempstring + "static const int " + funclist[counter] + "_arch_defs[] = {\n"; + counter += 1; + for arch_list in fcount: + tempstring = tempstring + "#if defined(LV_HAVE_" + for ind in range(len(arch_list)): + tempstring = tempstring + arch_list[ind] + ")"; + if ind < len(arch_list) - 1: + tempstring = tempstring + " && defined(LV_HAVE_"; + tempstring = tempstring + "\n" + tempstring = tempstring + " (1 << LV_" + for ind in range(len(arch_list)): + tempstring = tempstring + arch_list[ind]; + if ind < len(arch_list) - 1: + tempstring = tempstring + ") + (1 << LV_" + tempstring = tempstring + "),\n#endif\n" + tempstring = strip_trailing(tempstring, ",") + tempstring = tempstring + "};\n\n" + + counter = 0; + for fcount in fcountlist: + tempstring += "static const int " + funclist[counter] + "_n_archs = " + counter += 1; + for arch_list in fcount: + tempstring = tempstring + " (LV_" + for ind in range(len(arch_list)): + tempstring = tempstring + arch_list[ind] + "_CNT"; + if ind < len(arch_list) - 1: + tempstring = tempstring + " * LV_"; + tempstring = tempstring + ") + "; + tempstring = strip_trailing(tempstring, " + "); + tempstring = tempstring + ";\n" + + + tempstring = tempstring + emit_epilog(); + tempstring = tempstring +"#endif /*INCLUDED_VOLK_REGISTRY_H*/\n"; + + return tempstring; + diff --git a/volk/gen/make_set_simd.py b/volk/gen/make_set_simd.py new file mode 100644 index 000000000..5a848e59e --- /dev/null +++ b/volk/gen/make_set_simd.py @@ -0,0 +1,166 @@ +# +# Copyright 2010 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/>. +# + +from xml.dom import minidom + +def make_set_simd(dom, machines) : + tempstring = ""; + tempstring = tempstring +'dnl this file is auto generated by volk_register.py\n\n'; + + tempstring = tempstring +'\ndnl define arch checks\n'; + for domarch in dom: + if str(domarch.attributes["type"].value) != "all": + arch = str(domarch.attributes["name"].value); + flag = domarch.getElementsByTagName("flag"); + flag = str(flag[0].firstChild.data); + tempstring = tempstring + "AC_DEFUN([_TRY_ADD_" + arch.swapcase() + "],\n"; + tempstring = tempstring + "[\n"; + tempstring = tempstring + " LF_CHECK_CC_FLAG([-" + flag + "])\n"; + tempstring = tempstring + " LF_CHECK_CXX_FLAG([-" + flag + "])\n"; + tempstring = tempstring + "])\n"; + + tempstring = tempstring +'\ndnl main set_simd_flags\n'; + tempstring = tempstring + "AC_DEFUN([LV_SET_SIMD_FLAGS],\n"; + tempstring = tempstring + "[\n"; + #tempstring = tempstring + " AC_REQUIRE([GR_SET_MD_CPU])\n"; + tempstring = tempstring + " AC_SUBST(LV_CXXFLAGS)\n"; + tempstring = tempstring + " indCC=no\n"; + tempstring = tempstring + " indCXX=no\n"; + tempstring = tempstring + " indLV_ARCH=no\n"; + tempstring = tempstring + " AC_ARG_WITH(lv_arch,\n"; + tempstring = tempstring + " AC_HELP_STRING([--with-lv_arch=ARCH],[set volk hardware speedups as space separated string with elements from the following list("; + + for domarch in dom: + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + arch + ", " + tempstring = tempstring[0:len(tempstring) - 2]; + + tempstring = tempstring + ")]),\n"; + tempstring = tempstring + " [cf_with_lv_arch=\"$withval\"],\n"; + tempstring = tempstring + " [cf_with_lv_arch=\"\"])\n"; + if str(domarch.attributes["type"].value) == "all": + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + " AC_DEFINE(LV_MAKE_" + arch.swapcase() + ", 1, [always set "+ arch + "!])\n"; + tempstring = tempstring + " ADDONS=\"\"\n"; + tempstring = tempstring + " BUILT_ARCHS=\"\"\n"; + #tempstring = tempstring + " _MAKE_FAKE_PROCCPU\n"; + tempstring = tempstring + " OVERRULE_FLAG=\"no\"\n"; + tempstring = tempstring + " if test -z \"$cf_with_lv_arch\"; then\n"; + tempstring = tempstring + " cf_with_lv_arch=\""; + for domarch in dom: + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + arch + " "; + tempstring = tempstring[0:-1] + "\"\n"; + tempstring = tempstring + " OVERRULE_FLAG=\"yes\"\n"; + tempstring = tempstring + " fi\n"; + + tempstring = tempstring +'\ndnl init LV_MAKE_XXX and then try to add archs\n'; + for domarch in dom: + if str(domarch.attributes["type"].value) != "all": + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + " LV_MAKE_" + arch.swapcase() + "=no\n"; + + for domarch in dom: + arch = str(domarch.attributes["name"].value); + atype = str(domarch.attributes["type"].value); + if atype != "all": + tempstring = tempstring + " _TRY_ADD_" + arch.swapcase() + "\n"; + + for domarch in dom: + arch = str(domarch.attributes["name"].value); + atype = str(domarch.attributes["type"].value); + tempstring = tempstring +'\ndnl add in flags for arch ' + arch + '\n'; + overrule = domarch.getElementsByTagName("overrule"); + if overrule: + overrule = str(overrule[0].firstChild.data); + else: + overrule = ""; + overrule_val = domarch.getElementsByTagName("overrule_val"); + if overrule_val: + overrule_val = str(overrule_val[0].firstChild.data); + else: + overrule_val = ""; + flag = domarch.getElementsByTagName("flag"); + flag = str(flag[0].firstChild.data); + if atype != "all": + tempstring = tempstring + " for i in $lf_CXXFLAGS\n" + tempstring = tempstring + " do\n" + tempstring = tempstring + " if test \"X$i\" = X-" + flag +"; then\n"; + tempstring = tempstring + " indCXX=yes\n"; + tempstring = tempstring + " fi\n" + tempstring = tempstring + " done\n" + tempstring = tempstring + " for i in $lf_CFLAGS\n" + tempstring = tempstring + " do\n" + tempstring = tempstring + " if test \"X$i\" = X-" + flag +"; then\n"; + tempstring = tempstring + " indCC=yes\n"; + tempstring = tempstring + " fi\n" + tempstring = tempstring + " done\n" + tempstring = tempstring + " for i in $cf_with_lv_arch\n" + tempstring = tempstring + " do\n" + tempstring = tempstring + " if test \"X$i\" = X" + arch + "; then\n"; + tempstring = tempstring + " indLV_ARCH=yes\n" + tempstring = tempstring + " fi\n" + tempstring = tempstring + " done\n" + tempstring = tempstring + " if test -n \"" + overrule + "\" && test \"$" + overrule + "\" == \"" + overrule_val + "\" && test \"$OVERRULE_FLAG\" == \"yes\" && test \"$indLV_ARCH\" == \"yes\"; then\n" + tempstring = tempstring + " indLV_ARCH=no\n" + tempstring = tempstring + " fi\n" + + tempstring = tempstring + " if test \"$indCC\" == \"yes\" && test \"$indCXX\" == \"yes\" && test \"$indLV_ARCH\" == \"yes\"; then\n" + + #tempstring = tempstring + " ADDONS=\"${ADDONS} -" + flag + "\"\n"; + tempstring = tempstring + " BUILT_ARCHS=\"${BUILT_ARCHS} " + arch + "\"\n"; + tempstring = tempstring + " LV_MAKE_" + arch.swapcase() + "=yes\n"; + tempstring = tempstring + " fi\n" + tempstring = tempstring + " indCC=no\n" + tempstring = tempstring + " indCXX=no\n" + tempstring = tempstring + " indLV_ARCH=no\n" + else: + tempstring = tempstring + " for i in $cf_with_lv_arch\n" + tempstring = tempstring + " do\n" + tempstring = tempstring + " if test \"X$i\" = X" + arch + "; then\n"; + tempstring = tempstring + " indLV_ARCH=yes\n" + tempstring = tempstring + " fi\n" + tempstring = tempstring + " done\n" + tempstring = tempstring + " if test -n \"" + overrule + "\" && test \"$" + overrule + "\" == \"" + overrule_val + "\" && test \"$OVERRULE_FLAG\" == \"yes\" && test \"$indLV_ARCH\" == \"yes\"; then\n" + tempstring = tempstring + " indLV_ARCH=no\n" + tempstring = tempstring + " fi\n" + tempstring = tempstring + " if test \"$indLV_ARCH\" == \"yes\"; then\n" + tempstring = tempstring + " LV_MAKE_" + arch.swapcase() + "=yes\n"; + tempstring = tempstring + " BUILT_ARCHS=\"${BUILT_ARCHS} " + arch + "\"\n"; + tempstring = tempstring + " fi\n" + tempstring = tempstring + " indLV_ARCH=no\n" + + + for domarch in dom: + arch = str(domarch.attributes["name"].value); + tempstring = tempstring + " AM_CONDITIONAL(LV_MAKE_" + arch.swapcase() + ", test \"$LV_MAKE_" + arch.swapcase() + "\" == \"yes\")\n"; + + tempstring += "\n" + #now we can define the machines we're compiling + for machine_name in machines: + tempstring += " AM_CONDITIONAL(LV_MACHINE_" + machine_name.swapcase() + ", " + marchlist = machines[machine_name] + for march in marchlist: + tempstring += "test \"$LV_MAKE_" + march.swapcase() + "\" == \"yes\" && " + + tempstring += "test true)\n" #just so we don't have to detect the last one in the group, i know + tempstring = tempstring + " LV_CXXFLAGS=\"${LV_CXXFLAGS} ${ADDONS}\"\n" + tempstring = tempstring + "])\n" + + return tempstring; + + diff --git a/volk/gen/make_typedefs.py b/volk/gen/make_typedefs.py new file mode 100644 index 000000000..8f9f2b55e --- /dev/null +++ b/volk/gen/make_typedefs.py @@ -0,0 +1,23 @@ +from xml.dom import minidom +import string +from volk_regexp import * + + + +def make_typedefs(funclist, retlist, my_argtypelist) : + tempstring = ""; + tempstring = tempstring + '/*this file is auto generated by volk_register.py*/'; + tempstring = tempstring + '/*this file is auto generated by volk_register.py*/'; + tempstring = tempstring + '\n#ifndef INCLUDED_VOLK_TYPEDEFS'; + tempstring = tempstring + '\n#define INCLUDED_VOLK_TYPEDEFS\n'; + tempstring = tempstring + '\n\n#include<inttypes.h>\n'; + tempstring = tempstring + '#include<volk/volk_complex.h>\n'; + + tempstring = tempstring + '\n'; + + for i in range(len(funclist)): + tempstring = tempstring + "typedef " + retlist[i] +" (*" + replace_volk.sub("p", funclist[i]) + ")(" + my_argtypelist[i] + ");\n"; + + tempstring = tempstring + "#endif /*INCLUDED_VOLK_TYPEDEFS*/\n"; + + return tempstring; diff --git a/volk/gen/volk_regexp.py b/volk/gen/volk_regexp.py new file mode 100644 index 000000000..b83ce5206 --- /dev/null +++ b/volk/gen/volk_regexp.py @@ -0,0 +1,14 @@ +import re +import string + +remove_after_underscore = re.compile("_.*"); +space_remove = re.compile(" "); +leading_space_remove = re.compile("^ *"); +replace_arch = re.compile(", const char\* arch"); +replace_bracket = re.compile(" {"); +replace_volk = re.compile("volk"); + +def strip_trailing(tostrip, stripstr): + lindex = tostrip.rfind(stripstr) + tostrip = tostrip[0:lindex] + string.replace(tostrip[lindex:len(tostrip)], stripstr, ""); + return tostrip diff --git a/volk/gen/volk_register.py b/volk/gen/volk_register.py new file mode 100755 index 000000000..19fc61c15 --- /dev/null +++ b/volk/gen/volk_register.py @@ -0,0 +1,305 @@ +#! /usr/bin/env python + +import sys +import os +import re +import string +from xml.dom import minidom +from volk_regexp import * +from make_cpuid_c import make_cpuid_c +from make_cpuid_h import make_cpuid_h +from make_set_simd import make_set_simd +from make_registry import make_registry +from make_config_fixed import make_config_fixed +from make_typedefs import make_typedefs +from make_environment_init_c import make_environment_init_c +from make_environment_init_h import make_environment_init_h +from make_makefile_am import make_makefile_am +from make_machines_h import make_machines_h +from make_machines_c import make_machines_c +from make_each_machine_c import make_each_machine_c +from make_c import make_c +from make_h import make_h +import copy + +#set srcdir and gendir +srcdir = os.path.dirname(os.path.dirname(__file__)) +try: gendir = sys.argv[1] +except: gendir = os.path.dirname(__file__) + +#ensure directories exist +for dir in ( + (os.path.join(gendir, 'include', 'volk')), + (os.path.join(gendir, 'lib')), + (os.path.join(gendir, 'config')) +): + if not os.path.exists(dir): os.makedirs(dir) + +outfile_set_simd = open(os.path.join(gendir, "config/lv_set_simd_flags.m4"), "w") +outfile_reg = open(os.path.join(gendir, "include/volk/volk_registry.h"), "w") +outfile_h = open(os.path.join(gendir, "include/volk/volk.h"), "w") +outfile_c = open(os.path.join(gendir, "lib/volk.cc"), "w") +outfile_typedefs = open(os.path.join(gendir, "include/volk/volk_typedefs.h"), "w") +outfile_init_h = open(os.path.join(gendir, "lib/volk_init.h"), "w") +outfile_cpu_h = open(os.path.join(gendir, "include/volk/volk_cpu.h"), "w") +outfile_cpu_c = open(os.path.join(gendir, "lib/volk_cpu.c"), "w") +#outfile_config_in = open(os.path.join(gendir, "include/volk/volk_config.h.in"), "w") +outfile_config_fixed = open(os.path.join(gendir, "include/volk/volk_config_fixed.h"), "w") +#outfile_mktables = open(os.path.join(gendir, "lib/volk_mktables.c"), "w") +outfile_environment_c = open(os.path.join(gendir, "lib/volk_environment_init.c"), "w") +outfile_environment_h = open(os.path.join(gendir, "include/volk/volk_environment_init.h"), "w") +outfile_makefile_am = open(os.path.join(gendir, "lib/Makefile.am"), "w") +outfile_machines_h = open(os.path.join(gendir, "include/volk/volk_machines.h"), "w") +outfile_machines_c = open(os.path.join(gendir, "lib/volk_machines.cc"), "w") +infile = open(os.path.join(srcdir, "include/volk/Makefile.am"), "r") + + +mfile = infile.readlines(); + +datatypes = []; +functions = []; + + + +for line in mfile: + subline = re.search(".*_(a16|u)\.h.*", line); + if subline: + subsubline = re.search("(?<=volk_).*", subline.group(0)); + if subsubline: + dtype = remove_after_underscore.sub("", subsubline.group(0)); + subdtype = re.search("[0-9]+[A-z]+", dtype); + if subdtype: + datatypes.append(subdtype.group(0)); + + +datatypes = set(datatypes); + +for line in mfile: + for dt in datatypes: + if dt in line: + subline = re.search("(volk_" + dt +"_.*(a16|u).*\.h)", line); + if subline: + + subsubline = re.search(".+(?=\.h)", subline.group(0)); + functions.append(subsubline.group(0)); + +archs = []; +afile = minidom.parse(os.path.join(srcdir, "gen/archs.xml")) +filearchs = afile.getElementsByTagName("arch"); +for filearch in filearchs: + archs.append(str(filearch.attributes["name"].value)); + +for arch in archs: + a_var = re.search("^\$", arch); + if a_var: + archs.remove(arch); + + + +archflags_dict = {} +for filearch in filearchs: + archflags_dict[str(filearch.attributes["name"].value)] = str(filearch.getElementsByTagName("flag")[0].firstChild.data) + +archs_or = "(" +for arch in archs: + archs_or = archs_or + string.upper(arch) + "|"; +archs_or = archs_or[0:len(archs_or)-1]; +archs_or = archs_or + ")"; + +#get machine list and parse to a list of machines, each with a list of archs (none of this DOM crap) +machine_str_dict = {} +mfile = minidom.parse(os.path.join(srcdir, "gen/machines.xml")) +filemachines = mfile.getElementsByTagName("machine") + +for filemachine in filemachines: + machine_str_dict[str(filemachine.attributes["name"].value)] = str(filemachine.getElementsByTagName("archs")[0].firstChild.data).split() + +#all right now you have a dict of arch lists +#next we expand it +#this is an expanded list accounting for the OR syntax +#TODO: make this work for multiple "|" machines +machines = {} +already_done = False +for machine_name in machine_str_dict: + already_done = False + marchlist = machine_str_dict[machine_name] + for march in marchlist: + or_marchs = march.split("|") + if len(or_marchs) > 1: + marchlist.remove(march) + for or_march in or_marchs: + tempmarchlist = copy.deepcopy(marchlist) + tempmarchlist.append(or_march) + machines[machine_name + "_" + or_march] = tempmarchlist + already_done = True + + if not already_done: + machines[machine_name] = marchlist + +#for machine_name in machines: +# print machine_name + ": " + str(machines[machine_name]) + +#ok, now we have all the machines we're going to build. next step is to generate a Makefile.am where they're all laid out and compiled + +taglist = []; +fcountlist = []; +arched_arglist = []; +retlist = []; +my_arglist = []; +my_argtypelist = []; +for func in functions: + tags = []; + fcount = []; + infile_source = open(os.path.join(srcdir, 'include', 'volk', func + ".h")) + begun_name = 0; + begun_paren = 0; + sourcefile = infile_source.readlines(); + infile_source.close(); + for line in sourcefile: +#FIXME: make it work for multiple #if define()s + archline = re.search("^\#if.*?LV_HAVE_" + archs_or + ".*", line); + if archline: + arch = archline.group(0); + archline = re.findall(archs_or + "(?=( |\n|&))", line); + if archline: + archsublist = []; + for tup in archline: + archsublist.append(tup[0]); + fcount.append(archsublist); + testline = re.search("static inline.*?" + func, line); + if (not testline): + continue + tagline = re.search(func + "_.+", line); + if tagline: + tag = re.search("(?<=" + func + "_)\w+(?= *\()",line); + if tag: + tag = re.search("\w+", tag.group(0)); + if tag: + tags.append(tag.group(0)); + + + if begun_name == 0: + retline = re.search(".+(?=" + func + ")", line); + if retline: + ret = retline.group(0); + + + + + subline = re.search(func + ".*", line); + if subline: + subsubline = re.search("\(.*?\)", subline.group(0)); + if subsubline: + args = subsubline.group(0); + + else: + begun_name = 1; + subsubline = re.search("\(.*", subline.group(0)); + if subsubline: + args = subsubline.group(0); + begun_paren = 1; + else: + if begun_paren == 1: + subline = re.search(".*?\)", line); + if subline: + args = args + subline.group(0); + begun_name = 0; + begun_paren = 0; + else: + subline = re.search(".*", line); + args = args + subline.group(0); + else: + subline = re.search("\(.*?\)", line); + if subline: + args = subline.group(0); + begun_name = 0; + else: + subline = re.search("\(.*", line); + if subline: + args = subline.group(0); + begun_paren = 1; + + replace = re.compile("static "); + ret = replace.sub("", ret); + replace = re.compile("inline "); + ret = replace.sub("", ret); + replace = re.compile("\)"); + arched_args = replace.sub(", const char* arch) {", args); + + remove = re.compile('\)|\(|{'); + rargs = remove.sub("", args); + sargs = rargs.split(','); + + + + margs = []; + atypes = []; + for arg in sargs: + temp = arg.split(" "); + margs.append(temp[-1]); + replace = re.compile(" " + temp[-1]); + atypes.append(replace.sub("", arg)); + + + my_args = "" + arg_types = "" + for arg in range(0, len(margs) - 1): + this_arg = leading_space_remove.sub("", margs[arg]); + my_args = my_args + this_arg + ", "; + this_type = leading_space_remove.sub("", atypes[arg]); + arg_types = arg_types + this_type + ", "; + + this_arg = leading_space_remove.sub("", margs[-1]); + my_args = my_args + this_arg; + this_type = leading_space_remove.sub("", atypes[-1]); + arg_types = arg_types + this_type; + my_argtypelist.append(arg_types); + + if(ret[-1] != ' '): + ret = ret + ' '; + + arched_arglist.append(arched_args); #!!!!!!!!!!! + my_arglist.append(my_args) #!!!!!!!!!!!!!!!!! + retlist.append(ret); + fcountlist.append(fcount); + taglist.append(tags); + + +outfile_cpu_h.write(make_cpuid_h(filearchs)); +outfile_cpu_h.close(); + +outfile_cpu_c.write(make_cpuid_c(filearchs)); +outfile_cpu_c.close(); + +outfile_set_simd.write(make_set_simd(filearchs, machines)); +outfile_set_simd.close(); + +outfile_reg.write(make_registry(filearchs, functions, fcountlist, taglist)); +outfile_reg.close(); + +outfile_config_fixed.write(make_config_fixed(filearchs)); +outfile_config_fixed.close(); + +outfile_typedefs.write(make_typedefs(functions, retlist, my_argtypelist)); +outfile_typedefs.close(); + +outfile_makefile_am.write(make_makefile_am(filearchs, machines, archflags_dict)) +outfile_makefile_am.close() + +outfile_machines_h.write(make_machines_h(functions, machines)) +outfile_machines_h.close() + +outfile_machines_c.write(make_machines_c(machines)) +outfile_machines_c.close() + +outfile_c.write(make_c(machines, archs, functions, arched_arglist, my_arglist)) +outfile_c.close() + +outfile_h.write(make_h(functions, arched_arglist)) +outfile_h.close() + +for machine in machines: + machine_c_filename = os.path.join(gendir, "lib/volk_machine_" + machine + ".cc") + outfile_machine_c = open(machine_c_filename, "w") + outfile_machine_c.write(make_each_machine_c(machine, machines[machine], functions, fcountlist, taglist)) + outfile_machine_c.close() |