python regex-based preprocessor proof of concept

This commit is contained in:
2017-04-18 22:28:48 -04:00
parent d6cf38a929
commit 4182fa2967
4 changed files with 226 additions and 0 deletions

3
.gitignore vendored
View File

@@ -10,6 +10,9 @@ docs/doxygen
docs/*.html
tests*/*cpp
tests*/*run
tests*/*.o
tests_ispcpp/*.h
tests_ispcpp/*pre*
logs/
notify_log.log
alloy_results_*

189
prepro.py Normal file
View File

@@ -0,0 +1,189 @@
import re
import sys
def floating2float(function, idx):
typ = 'floating<' + str(idx) + '>'
return function.replace(typ, 'float')
def floating2double(function, idx):
typ = 'floating<' + str(idx) + '>'
return function.replace(typ, 'double')
def number2float(function, idx):
typ = 'number<' + str(idx) + '>'
return function.replace(typ, 'float')
def number2double(function, idx):
typ = 'number<' + str(idx) + '>'
return function.replace(typ, 'double')
def number2int(function, idx):
typ = 'number<' + str(idx) + '>'
return function.replace(typ, 'int')
def number2long(function, idx):
typ = 'number<' + str(idx) + '>'
return function.replace(typ, 'long')
def number2short(function, idx):
typ = 'number<' + str(idx) + '>'
return function.replace(typ, 'short')
def number2char(function, idx):
typ = 'number<' + str(idx) + '>'
return function.replace(typ, 'char')
def integer2int(function, idx):
typ = 'integer<' + str(idx) + '>'
return function.replace(typ, 'int')
def integer2long(function, idx):
typ = 'integer<' + str(idx) + '>'
return function.replace(typ, 'long')
def integer2short(function, idx):
typ = 'integer<' + str(idx) + '>'
return function.replace(typ, 'short')
def integer2char(function, idx):
typ = 'integer<' + str(idx) + '>'
return function.replace(typ, 'char')
def strip_types(fun, i):
return fun.replace('export', '').replace('void', '').replace('float', '') \
.replace('double', '').replace('char','').replace('short','') \
.replace('int','').replace('long','').replace('[]','') \
.replace('*','').replace('(','_' + str(i) + '(') \
.replace('uniform','')
if __name__ == '__main__':
if (len(sys.argv) != 2):
print 'usage:\n\tpython ',
print sys.argv[0],
print '[file.ispc]'
exit(1)
f = open(sys.argv[1], 'r')
function = f.read()
fun_def = re.findall(r'export [^{]*\)', function)[0]
print fun_def
f.close()
floating = 0
number = 0
integer = 0
while ('floating<' + str(floating) + '>' in function):
floating += 1
while ('number<' + str(number) + '>' in function):
number += 1
while ('integer<' + str(integer) + '>' in function):
integer += 1
for i in range(len(re.findall(r'floating[\s+]', function))):
function = function.replace('floating ',
'floating<' + str(floating) + '> ', 1)
fun_def = fun_def.replace('floating ',
'floating<' + str(floating) + '> ', 1)
floating += 1
for i in range(len(re.findall(r'number[\s+]', function))):
function = function.replace('number ',
'number<' + str(number) + '> ', 1)
fun_def = fun_def.replace('number ',
'number<' + str(number) + '> ', 1)
number += 1
for i in range(len(re.findall(r'integer[\s+]', function))):
function = function.replace('integer ',
'integer<' + str(integer) + '> ', 1)
fun_def = fun_def.replace('integer ',
'integer<' + str(integer) + '> ', 1)
integer += 1
floats = [[(fun_def, function)]]
for i in range(floating):
floats.append([])
for (h, f) in floats[i]:
floats[i+1].append((floating2float(h, i),
floating2float(f, i)
))
floats[i+1].append((floating2double(h, i),
floating2double(f, i)
))
numbers = [[]]
for f in floats[floating]:
numbers[0].append(f)
for i in range(number):
numbers.append([])
for (h, f) in numbers[i]:
numbers[i+1].append((number2float(h, i),
number2float(f, i)
))
numbers[i+1].append((number2double(h, i),
number2double(f, i)
))
numbers[i+1].append((number2int(h, i),
number2int(f, i)
))
numbers[i+1].append((number2long(h, i),
number2long(f, i)
))
numbers[i+1].append((number2short(h, i),
number2short(f, i)
))
numbers[i+1].append((number2char(h, i),
number2char(f, i)
))
integers = [[]]
for f in numbers[number]:
integers[0].append(f)
for i in range(integer):
integers.append([])
for (h, f) in integers[i]:
integers[i+1].append((integer2int(h, i),
integer2int(f, i)
))
integers[i+1].append((integer2long(h, i),
integer2long(f, i)
))
integers[i+1].append((integer2short(h, i),
integer2short(f, i)
))
integers[i+1].append((integer2char(h, i),
integer2char(f, i)
))
o = open(sys.argv[1] + '.pre.ispc', 'w')
hdr = open(sys.argv[1] + '.h', 'w')
hdr.write('#include "' + '.'.join(sys.argv[1].split('.')[:-1]) + '.h"\n\n')
hdr.write('#ifndef _' + sys.argv[1].upper().replace('.', '_') + '_H_\n')
hdr.write('#define _' + sys.argv[1].upper().replace('.', '_') + '_H_\n')
hdr.write('namespace ispc {\n')
fun_name = re.findall(r'[a-zA-Z_][a-zA-Z0-9_]*\(', function)[0][:-1]
i = 0
for (h, f) in integers[integer]:
o.write(f.replace(fun_name, fun_name+'_'+str(i), 1))
hdr.write(h.replace('uniform','').replace('export','') \
+ '\n{\n\treturn ' + strip_types(h, i) + ';\n}\n\n')
i += 1
o.close()
hdr.write('}\n')
hdr.write('#endif\n')
hdr.close()
exit(0)

23
tests_ispcpp/hello.cpp Normal file
View File

@@ -0,0 +1,23 @@
#include <stdlib.h>
#include <stdio.h>
#include "hello.ispc.h"
int main() {
float A[100];
float B[100];
double result[100];
for (int i=0; i<100; i++) {
A[i] = 100 - i;
B[i] = i*i;
}
ispc::saxpy(100, 3.1415926535, (float*)&A, (float*)&B, (double*)&result);
for (int i=0; i<100; i++) {
printf("%.6f\n", result[i]);
}
return 0;
}

11
tests_ispcpp/hello.ispc Normal file
View File

@@ -0,0 +1,11 @@
export void saxpy(uniform int N,
uniform floating<0> scale,
uniform floating<1> X[],
uniform floating<1> Y[],
uniform floating<2> result[])
{
foreach (i = 0 ... N) {
floating<2> tmp = scale * X[i] + Y[i];
result[i] = tmp;
}
}