1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2025-06-22 08:24:08 +00:00

Port templates from python-cheetah to python-mako

python-mako will be included as a dependency in GNU Radio 3.8 (see
https://github.com/gnuradio/gnuradio/pull/303). Changes following
https://github.com/gnuradio/volk/pull/94
This commit is contained in:
Carles Fernandez 2016-07-15 04:34:49 +02:00
parent ceeedbaaed
commit 0d448e8857
12 changed files with 134 additions and 171 deletions

View File

@ -75,15 +75,15 @@ SET(CROSSCOMPILE_MULTILIB ${CROSSCOMPILE_MULTILIB} CACHE STRING "Define \"true\"
# Python # Python
include(VolkPython) #sets PYTHON_EXECUTABLE and PYTHON_DASH_B include(VolkPython) #sets PYTHON_EXECUTABLE and PYTHON_DASH_B
VOLK_PYTHON_CHECK_MODULE("python >= 2.5" sys "sys.version.split()[0] >= '2.5'" PYTHON_MIN_VER_FOUND) VOLK_PYTHON_CHECK_MODULE("python >= 2.5" sys "sys.version.split()[0] >= '2.5'" PYTHON_MIN_VER_FOUND)
VOLK_PYTHON_CHECK_MODULE("Cheetah >= 2.0.0" Cheetah "Cheetah.Version >= '2.0.0'" CHEETAH_FOUND) VOLK_PYTHON_CHECK_MODULE("mako >= 1.0.0" mako "mako.__version__ >= '1.0.0'" MAKO_FOUND)
if(NOT PYTHON_MIN_VER_FOUND) if(NOT PYTHON_MIN_VER_FOUND)
message(FATAL_ERROR "Python 2.5 or greater required to build VOLK_GNSSSDR") message(FATAL_ERROR "Python 2.5 or greater required to build VOLK_GNSSSDR")
endif() endif()
# Cheetah # Mako
if(NOT CHEETAH_FOUND) if(NOT MAKO_FOUND)
message(FATAL_ERROR "Cheetah templates required to build VOLK_GNSSSDR") message(FATAL_ERROR "Mako templates required to build VOLK_GNSSSDR")
endif() endif()
# Boost # Boost

View File

@ -17,7 +17,7 @@ However, you can install and use VOLK_GNSSSDR kernels as you use VOLK's, indepen
First, make sure that the required dependencies are installed in you machine: First, make sure that the required dependencies are installed in you machine:
~~~~~~ ~~~~~~
$ sudo apt-get install git subversion cmake python-cheetah libboost-dev libbbost-filesystem $ sudo apt-get install git subversion cmake python-mako libboost-dev libbbost-filesystem
~~~~~~ ~~~~~~
In order to build and install the library, go to the base folder of the source code and do: In order to build and install the library, go to the base folder of the source code and do:

View File

@ -25,22 +25,7 @@ import optparse
import volk_gnsssdr_arch_defs import volk_gnsssdr_arch_defs
import volk_gnsssdr_machine_defs import volk_gnsssdr_machine_defs
import volk_gnsssdr_kernel_defs import volk_gnsssdr_kernel_defs
from Cheetah import Template from mako.template 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()
conly = fcn in ('include', 'define', 'ifdef', 'ifndef', 'endif', 'elif', 'pragma')
both = fcn in ('if', 'else')
istmpl = '$' in stuff
if 'defined' in stuff: istmpl = False
if conly 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): def __parse_tmpl(_tmpl, **kwargs):
defs = { defs = {
@ -51,13 +36,12 @@ def __parse_tmpl(_tmpl, **kwargs):
'kernels': volk_gnsssdr_kernel_defs.kernels, 'kernels': volk_gnsssdr_kernel_defs.kernels,
} }
defs.update(kwargs) defs.update(kwargs)
_tmpl = __escape_pre_processor(_tmpl)
_tmpl = """ _tmpl = """
/* this file was generated by volk_gnsssdr template utils, do not edit! */ /* this file was generated by volk_gnsssdr template utils, do not edit! */
""" + _tmpl """ + _tmpl
return str(Template.Template(_tmpl, defs)) return str(Template(_tmpl).render(**defs))
def main(): def main():
parser = optparse.OptionParser() parser = optparse.OptionParser()

View File

@ -110,93 +110,91 @@ bool volk_gnsssdr_is_aligned(const void *ptr)
#define LV_HAVE_GENERIC #define LV_HAVE_GENERIC
#define LV_HAVE_DISPATCHER #define LV_HAVE_DISPATCHER
#for $kern in $kernels %for kern in kernels:
#if $kern.has_dispatcher %if kern.has_dispatcher:
#include <volk_gnsssdr/$(kern.name).h> //pulls in the dispatcher #include <volk_gnsssdr/${kern.name}.h> //pulls in the dispatcher
#end if %endif
static inline void __$(kern.name)_d($kern.arglist_full) static inline void __${kern.name}_d(${kern.arglist_full})
{ {
#if $kern.has_dispatcher %if kern.has_dispatcher:
$(kern.name)_dispatcher($kern.arglist_names); ${kern.name}_dispatcher(${kern.arglist_names});
return; return;
#end if %endif
if (volk_gnsssdr_is_aligned( if (volk_gnsssdr_is_aligned(<% num_open_parens = 0 %>
#set $num_open_parens = 0 %for arg_type, arg_name in kern.args:
#for $arg_type, $arg_name in $kern.args %if '*' in arg_type:
#if '*' in $arg_type VOLK_OR_PTR(${arg_name},<% num_open_parens += 1 %>
VOLK_OR_PTR($arg_name, %endif
#set $num_open_parens += 1 %endfor
#end if 0<% end_open_parens = ')'*num_open_parens %>${end_open_parens}
#end for
0$(')'*$num_open_parens)
)){ )){
$(kern.name)_a($kern.arglist_names); ${kern.name}_a(${kern.arglist_names});
} }
else{ else{
$(kern.name)_u($kern.arglist_names); ${kern.name}_u(${kern.arglist_names});
} }
} }
static inline void __init_$(kern.name)(void) static inline void __init_${kern.name}(void)
{ {
const char *name = get_machine()->$(kern.name)_name; const char *name = get_machine()->${kern.name}_name;
const char **impl_names = get_machine()->$(kern.name)_impl_names; const char **impl_names = get_machine()->${kern.name}_impl_names;
const int *impl_deps = get_machine()->$(kern.name)_impl_deps; const int *impl_deps = get_machine()->${kern.name}_impl_deps;
const bool *alignment = get_machine()->$(kern.name)_impl_alignment; const bool *alignment = get_machine()->${kern.name}_impl_alignment;
const size_t n_impls = get_machine()->$(kern.name)_n_impls; const size_t n_impls = get_machine()->${kern.name}_n_impls;
const size_t index_a = volk_gnsssdr_rank_archs(name, impl_names, impl_deps, alignment, n_impls, true/*aligned*/); const size_t index_a = volk_gnsssdr_rank_archs(name, impl_names, impl_deps, alignment, n_impls, true/*aligned*/);
const size_t index_u = volk_gnsssdr_rank_archs(name, impl_names, impl_deps, alignment, n_impls, false/*unaligned*/); const size_t index_u = volk_gnsssdr_rank_archs(name, impl_names, impl_deps, alignment, n_impls, false/*unaligned*/);
$(kern.name)_a = get_machine()->$(kern.name)_impls[index_a]; ${kern.name}_a = get_machine()->${kern.name}_impls[index_a];
$(kern.name)_u = get_machine()->$(kern.name)_impls[index_u]; ${kern.name}_u = get_machine()->${kern.name}_impls[index_u];
assert($(kern.name)_a); assert(${kern.name}_a);
assert($(kern.name)_u); assert(${kern.name}_u);
$(kern.name) = &__$(kern.name)_d; ${kern.name} = &__${kern.name}_d;
} }
static inline void __$(kern.name)_a($kern.arglist_full) static inline void __${kern.name}_a(${kern.arglist_full})
{ {
__init_$(kern.name)(); __init_${kern.name}();
$(kern.name)_a($kern.arglist_names); ${kern.name}_a(${kern.arglist_names});
} }
static inline void __$(kern.name)_u($kern.arglist_full) static inline void __${kern.name}_u(${kern.arglist_full})
{ {
__init_$(kern.name)(); __init_${kern.name}();
$(kern.name)_u($kern.arglist_names); ${kern.name}_u(${kern.arglist_names});
} }
static inline void __$(kern.name)($kern.arglist_full) static inline void __${kern.name}(${kern.arglist_full})
{ {
__init_$(kern.name)(); __init_${kern.name}();
$(kern.name)($kern.arglist_names); ${kern.name}(${kern.arglist_names});
} }
$kern.pname $(kern.name)_a = &__$(kern.name)_a; ${kern.pname} ${kern.name}_a = &__${kern.name}_a;
$kern.pname $(kern.name)_u = &__$(kern.name)_u; ${kern.pname} ${kern.name}_u = &__${kern.name}_u;
$kern.pname $(kern.name) = &__$(kern.name); ${kern.pname} ${kern.name} = &__${kern.name};
void $(kern.name)_manual($kern.arglist_full, const char* impl_name) void ${kern.name}_manual(${kern.arglist_full}, const char* impl_name)
{ {
const int index = volk_gnsssdr_get_index( const int index = volk_gnsssdr_get_index(
get_machine()->$(kern.name)_impl_names, get_machine()->${kern.name}_impl_names,
get_machine()->$(kern.name)_n_impls, get_machine()->${kern.name}_n_impls,
impl_name impl_name
); );
get_machine()->$(kern.name)_impls[index]( get_machine()->${kern.name}_impls[index](
$kern.arglist_names ${kern.arglist_names}
); );
} }
volk_gnsssdr_func_desc_t $(kern.name)_get_func_desc(void) { volk_gnsssdr_func_desc_t ${kern.name}_get_func_desc(void) {
const char **impl_names = get_machine()->$(kern.name)_impl_names; const char **impl_names = get_machine()->${kern.name}_impl_names;
const int *impl_deps = get_machine()->$(kern.name)_impl_deps; const int *impl_deps = get_machine()->${kern.name}_impl_deps;
const bool *alignment = get_machine()->$(kern.name)_impl_alignment; const bool *alignment = get_machine()->${kern.name}_impl_alignment;
const size_t n_impls = get_machine()->$(kern.name)_n_impls; const size_t n_impls = get_machine()->${kern.name}_n_impls;
volk_gnsssdr_func_desc_t desc = { volk_gnsssdr_func_desc_t desc = {
impl_names, impl_names,
impl_deps, impl_deps,
@ -206,4 +204,4 @@ volk_gnsssdr_func_desc_t $(kern.name)_get_func_desc(void) {
return desc; return desc;
} }
#end for %endfor

View File

@ -68,23 +68,23 @@ VOLK_API size_t volk_gnsssdr_get_alignment(void);
*/ */
VOLK_API bool volk_gnsssdr_is_aligned(const void *ptr); VOLK_API bool volk_gnsssdr_is_aligned(const void *ptr);
#for $kern in $kernels %for kern in kernels:
//! A function pointer to the dispatcher implementation //! A function pointer to the dispatcher implementation
extern VOLK_API $kern.pname $kern.name; extern VOLK_API ${kern.pname} ${kern.name};
//! A function pointer to the fastest aligned implementation //! A function pointer to the fastest aligned implementation
extern VOLK_API $kern.pname $(kern.name)_a; extern VOLK_API ${kern.pname} ${kern.name}_a;
//! A function pointer to the fastest unaligned implementation //! A function pointer to the fastest unaligned implementation
extern VOLK_API $kern.pname $(kern.name)_u; extern VOLK_API ${kern.pname} ${kern.name}_u;
//! Call into a specific implementation given by name //! Call into a specific implementation given by name
extern VOLK_API void $(kern.name)_manual($kern.arglist_full, const char* impl_name); extern VOLK_API void ${kern.name}_manual(${kern.arglist_full}, const char* impl_name);
//! Get description paramaters for this kernel //! Get description paramaters for this kernel
extern VOLK_API volk_gnsssdr_func_desc_t $(kern.name)_get_func_desc(void); extern VOLK_API volk_gnsssdr_func_desc_t ${kern.name}_get_func_desc(void);
#end for %endfor
__VOLK_DECL_END __VOLK_DECL_END

View File

@ -19,10 +19,10 @@
#ifndef INCLUDED_VOLK_GNSSSDR_CONFIG_FIXED_H #ifndef INCLUDED_VOLK_GNSSSDR_CONFIG_FIXED_H
#define INCLUDED_VOLK_GNSSSDR_CONFIG_FIXED_H #define INCLUDED_VOLK_GNSSSDR_CONFIG_FIXED_H
#for $i, $arch in enumerate($archs) %for i, arch in enumerate(archs):
#ifndef LV_$(arch.name.upper()) //#ifndef LV_${arch.name.upper()}
#define LV_$(arch.name.upper()) $i #define LV_${arch.name.upper()} ${i}
#endif //#endif
#end for %endfor
#endif /*INCLUDED_VOLK_GNSSSDR_CONFIG_FIXED*/ #endif /*INCLUDED_VOLK_GNSSSDR_CONFIG_FIXED*/

View File

@ -147,15 +147,14 @@ static int has_neon(void){
#endif #endif
} }
#for $arch in $archs %for arch in archs:
static int i_can_has_$arch.name (void) { static int i_can_has_${arch.name} (void) {
#for $check, $params in $arch.checks %for check, params in arch.checks:
if ($(check)($(', '.join($params))) == 0) return 0; if (${check}(<% joined_params = ', '.join(params)%>${joined_params}) == 0) return 0;
#end for %endfor
return 1; return 1;
} }
%endfor
#end for
#if defined(HAVE_FENV_H) #if defined(HAVE_FENV_H)
#if defined(FE_TONEAREST) #if defined(FE_TONEAREST)
@ -182,17 +181,17 @@ static int i_can_has_$arch.name (void) {
#endif #endif
void volk_gnsssdr_cpu_init() { void volk_gnsssdr_cpu_init() {
#for $arch in $archs %for arch in archs:
volk_gnsssdr_cpu.has_$arch.name = &i_can_has_$arch.name; volk_gnsssdr_cpu.has_${arch.name} = &i_can_has_${arch.name};
#end for %endfor
set_float_rounding(); set_float_rounding();
} }
unsigned int volk_gnsssdr_get_lvarch() { unsigned int volk_gnsssdr_get_lvarch() {
unsigned int retval = 0; unsigned int retval = 0;
volk_gnsssdr_cpu_init(); volk_gnsssdr_cpu_init();
#for $arch in $archs %for arch in archs:
retval += volk_gnsssdr_cpu.has_$(arch.name)() << LV_$(arch.name.upper()); retval += volk_gnsssdr_cpu.has_${arch.name}() << LV_${arch.name.upper()};
#end for %endfor
return retval; return retval;
} }

View File

@ -24,9 +24,9 @@
__VOLK_DECL_BEGIN __VOLK_DECL_BEGIN
struct VOLK_CPU { struct VOLK_CPU {
#for $arch in $archs %for arch in archs:
int (*has_$arch.name) (); int (*has_${arch.name}) ();
#end for %endfor
}; };
extern struct VOLK_CPU volk_gnsssdr_cpu; extern struct VOLK_CPU volk_gnsssdr_cpu;

View File

@ -16,12 +16,12 @@
* along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>. * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
*/ */
#set $this_machine = $machine_dict[$args[0]] <% this_machine = machine_dict[args[0]] %>
#set $arch_names = $this_machine.arch_names <% arch_names = this_machine.arch_names %>
#for $arch in $this_machine.archs %for arch in this_machine.archs:
#define LV_HAVE_$(arch.name.upper()) 1 #define LV_HAVE_${arch.name.upper()} 1
#end for %endfor
#include <volk_gnsssdr/volk_gnsssdr_common.h> #include <volk_gnsssdr/volk_gnsssdr_common.h>
#include "volk_gnsssdr_machines.h" #include "volk_gnsssdr_machines.h"
@ -31,46 +31,28 @@
#include "config.h" #include "config.h"
#endif #endif
#for $kern in $kernels %for kern in kernels:
#include <volk_gnsssdr/$(kern.name).h> #include <volk_gnsssdr/${kern.name}.h>
#end for %endfor
######################################################################## struct volk_gnsssdr_machine volk_gnsssdr_machine_${this_machine.name} = {
#def make_arch_have_list($archs) <% make_arch_have_list = (' | '.join(['(1 << LV_%s)'%a.name.upper() for a in this_machine.archs])) %> ${make_arch_have_list},
$(' | '.join(['(1 << LV_%s)'%a.name.upper() for a in $archs]))#slurp <% this_machine_name = "\""+this_machine.name+"\"" %> ${this_machine_name},
#end def ${this_machine.alignment},
##//list all kernels
######################################################################## %for kern in kernels:
#def make_impl_name_list($impls) <% impls = kern.get_impls(arch_names) %>
{$(', '.join(['"%s"'%i.name for i in $impls]))}#slurp ##//kernel name
#end def <% kern_name = "\""+kern.name+"\"" %> ${kern_name},
##//list of kernel implementations by name
######################################################################## <% make_impl_name_list = "{"+', '.join(['"%s"'%i.name for i in impls])+"}" %> ${make_impl_name_list},
#def make_impl_align_list($impls) ##//list of arch dependencies per implementation
{$(', '.join(['true' if i.is_aligned else 'false' for i in $impls]))}#slurp <% make_impl_deps_list = "{"+', '.join([' | '.join(['(1 << LV_%s)'%d.upper() for d in i.deps]) for i in impls])+"}" %> ${make_impl_deps_list},
#end def ##//alignment required? for each implementation
<% make_impl_align_list = "{"+', '.join(['true' if i.is_aligned else 'false' for i in impls])+"}" %> ${make_impl_align_list},
######################################################################## ##//pointer to each implementation
#def make_impl_deps_list($impls) <% make_impl_fcn_list = "{"+', '.join(['%s_%s'%(kern.name, i.name) for i in impls])+"}" %> ${make_impl_fcn_list},
{$(', '.join([' | '.join(['(1 << LV_%s)'%d.upper() for d in i.deps]) for i in $impls]))}#slurp ##//number of implementations listed here
#end def <% len_impls = len(impls) %> ${len_impls},
%endfor
########################################################################
#def make_impl_fcn_list($name, $impls)
{$(', '.join(['%s_%s'%($name, i.name) for i in $impls]))}#slurp
#end def
struct volk_gnsssdr_machine volk_gnsssdr_machine_$(this_machine.name) = {
$make_arch_have_list($this_machine.archs),
"$this_machine.name",
$this_machine.alignment,
#for $kern in $kernels
#set $impls = $kern.get_impls($arch_names)
"$kern.name", ##//kernel name
$make_impl_name_list($impls), ##//list of kernel implementations by name
$make_impl_deps_list($impls), ##//list of arch dependencies per implementation
$make_impl_align_list($impls), ##//alignment required? for each implementation
$make_impl_fcn_list($kern.name, $impls), ##//pointer to each implementation
$(len($impls)), ##//number of implementations listed here
#end for
}; };

View File

@ -21,11 +21,11 @@
#include "volk_gnsssdr_machines.h" #include "volk_gnsssdr_machines.h"
struct volk_gnsssdr_machine *volk_gnsssdr_machines[] = { struct volk_gnsssdr_machine *volk_gnsssdr_machines[] = {
#for $machine in $machines %for machine in machines:
#ifdef LV_MACHINE_$(machine.name.upper()) #ifdef LV_MACHINE_${machine.name.upper()}
&volk_gnsssdr_machine_$(machine.name), &volk_gnsssdr_machine_${machine.name},
#endif #endif
#end for %endfor
}; };
unsigned int n_volk_gnsssdr_machines = sizeof(volk_gnsssdr_machines)/sizeof(*volk_gnsssdr_machines); unsigned int n_volk_gnsssdr_machines = sizeof(volk_gnsssdr_machines)/sizeof(*volk_gnsssdr_machines);

View File

@ -31,21 +31,21 @@ struct volk_gnsssdr_machine {
const unsigned int caps; //capabilities (i.e., archs compiled into this machine, in the volk_gnsssdr_get_lvarch format) const unsigned int caps; //capabilities (i.e., archs compiled into this machine, in the volk_gnsssdr_get_lvarch format)
const char *name; const char *name;
const size_t alignment; //the maximum byte alignment required for functions in this library const size_t alignment; //the maximum byte alignment required for functions in this library
#for $kern in $kernels %for kern in kernels:
const char *$(kern.name)_name; const char *${kern.name}_name;
const char *$(kern.name)_impl_names[$(len($archs))]; const char *${kern.name}_impl_names[<%len_archs=len(archs)%>${len_archs}];
const int $(kern.name)_impl_deps[$(len($archs))]; const int ${kern.name}_impl_deps[${len_archs}];
const bool $(kern.name)_impl_alignment[$(len($archs))]; const bool ${kern.name}_impl_alignment[${len_archs}];
const $(kern.pname) $(kern.name)_impls[$(len($archs))]; const ${kern.pname} ${kern.name}_impls[${len_archs}];
const size_t $(kern.name)_n_impls; const size_t ${kern.name}_n_impls;
#end for %endfor
}; };
#for $machine in $machines %for machine in machines:
#ifdef LV_MACHINE_$(machine.name.upper()) #ifdef LV_MACHINE_${machine.name.upper()}
extern struct volk_gnsssdr_machine volk_gnsssdr_machine_$(machine.name); extern struct volk_gnsssdr_machine volk_gnsssdr_machine_${machine.name};
#endif #endif
#end for %endfor
__VOLK_DECL_END __VOLK_DECL_END

View File

@ -22,8 +22,8 @@
#include <inttypes.h> #include <inttypes.h>
#include <volk_gnsssdr/volk_gnsssdr_complex.h> #include <volk_gnsssdr/volk_gnsssdr_complex.h>
#for $kern in $kernels %for kern in kernels:
typedef void (*$(kern.pname))($kern.arglist_types); typedef void (*${kern.pname})(${kern.arglist_types});
#end for %endfor
#endif /*INCLUDED_VOLK_GNSSSDR_TYPEDEFS*/ #endif /*INCLUDED_VOLK_GNSSSDR_TYPEDEFS*/