diff options
Diffstat (limited to 'src/Specific/Framework/ArithmeticSynthesis/remake_packages.py')
-rwxr-xr-x | src/Specific/Framework/ArithmeticSynthesis/remake_packages.py | 253 |
1 files changed, 0 insertions, 253 deletions
diff --git a/src/Specific/Framework/ArithmeticSynthesis/remake_packages.py b/src/Specific/Framework/ArithmeticSynthesis/remake_packages.py deleted file mode 100755 index d9812fd94..000000000 --- a/src/Specific/Framework/ArithmeticSynthesis/remake_packages.py +++ /dev/null @@ -1,253 +0,0 @@ -#!/usr/bin/env python -from __future__ import with_statement -import re, os -import io - -PACKAGE_NAMES = [('../CurveParameters.v', [])] -CP_LIST = ['../CurveParametersPackage.v'] -CP_BASE_LIST = ['../CurveParametersPackage.v', 'BasePackage.v'] -CP_BASE_DEFAULTS_LIST = ['../CurveParametersPackage.v', 'BasePackage.v', 'DefaultsPackage.v'] -CP_BASE_DEFAULTS_FREEZE_LADDERSTEP_LIST = ['../CurveParametersPackage.v', 'BasePackage.v', 'DefaultsPackage.v', 'FreezePackage.v', 'LadderstepPackage.v'] -NORMAL_PACKAGE_NAMES = [('Base.v', (CP_LIST, None)), - ('Defaults.v', (CP_BASE_LIST, 'not_exists')), - ('../ReificationTypes.v', (CP_BASE_LIST, None)), - ('Freeze.v', (CP_BASE_LIST, ('freeze', 'not_exists'))), - ('Ladderstep.v', (CP_BASE_DEFAULTS_LIST, ('ladderstep', 'not_exists'))), - ('Karatsuba.v', (CP_BASE_DEFAULTS_LIST, 'goldilocks')), - ('Montgomery.v', (CP_BASE_DEFAULTS_FREEZE_LADDERSTEP_LIST, 'montgomery')), - ('../MontgomeryReificationTypes.v', (CP_BASE_LIST + ['MontgomeryPackage.v', '../ReificationTypesPackage.v'], 'montgomery'))] -ALL_FILE_NAMES = PACKAGE_NAMES + NORMAL_PACKAGE_NAMES # PACKAGE_CP_NAMES + WITH_CURVE_BASE_NAMES + ['../ReificationTypes.v'] -CONFIGS = ('goldilocks', 'karatsuba', 'montgomery', 'freeze', 'ladderstep') - -EXCLUDES = ('constr:((wt_divides_chain, wt_divides_chains))', ) - -contents = {} -lines = {} -fns = {} - -PY_FILE_NAME = os.path.basename(__file__) - -def init_contents(lines=lines, contents=contents): - for fname, _ in ALL_FILE_NAMES: - with open(fname, 'r') as f: - contents[fname] = f.read() - lines.update(dict((k, v.split('\n')) for k, v in contents.items())) - -def strip_prefix(name, prefix='local_'): - if name.startswith(prefix): return name[len(prefix):] - return name - -def init_fns(lines=lines, fns=fns): - header = 'Ltac pose_' - for fname, _ in ALL_FILE_NAMES: - stripped_lines = [i.strip() for i in lines[fname]] - fns[fname] = [(strip_prefix(name, 'local_'), args.strip(), name.startswith('local_')) - for line in stripped_lines - if line.startswith(header) - for name, args in re.findall('Ltac pose_([^ ]*' + ') ([A-Za-z0-9_\' ]*' + ')', line.strip())] - -def get_file_root(folder=os.path.dirname(__file__), filename='Makefile'): - dir_path = os.path.realpath(folder) - while not os.path.isfile(os.path.join(dir_path, filename)) and dir_path != '/': - dir_path = os.path.realpath(os.path.join(dir_path, '..')) - if not os.path.isfile(os.path.join(dir_path, filename)): - print('ERROR: Could not find Makefile in the root of %s' % folder) - raise Exception - return dir_path - -def modname_of_file_name(fname): - assert(fname[-2:] == '.v') - return 'Crypto.' + os.path.normpath(os.path.relpath(os.path.realpath(fname), os.path.join(root, 'src'))).replace(os.sep, '.')[:-2] - -def split_args(name, args_str, indent=''): - args = [arg.strip() for arg in args_str.split(' ')] - pass_args = [arg for arg in args if arg.startswith('P_')] - extract_args = [arg for arg in args if arg not in pass_args and arg != name] - if name not in args: - print('Error: %s not in %s' % (name, repr(args))) - assert(name in args) - assert(len(pass_args) + len(extract_args) + 1 == len(args)) - pass_args_str = ' '.join(pass_args) - if pass_args_str != '': pass_args_str += ' ' - extract_args_str = '' - nl_indent = ('\n%(indent)s ' % locals()) - if len(extract_args) > 0: - extract_args_str = nl_indent + nl_indent.join('let %s := Tag.get pkg TAG.%s in' % (arg, arg) for arg in extract_args) - return args, pass_args, extract_args, pass_args_str, extract_args_str - -def make_add_from_pose(name, args_str, indent='', only_if=None, local=False): - args, pass_args, extract_args, pass_args_str, extract_args_str = split_args(name, args_str, indent=indent) - ret = r'''%(indent)sLtac add_%(name)s pkg %(pass_args_str)s:=''' % locals() - local_str = ('local_' if local else '') - if_not_exists_str = '' - body = r'''%(extract_args_str)s -%(indent)s let %(name)s := fresh "%(name)s" in -%(indent)s ''' % locals() - body += r'''let %(name)s := pose_%(local_str)s%(name)s %(args_str)s in -%(indent)s ''' % locals() - if only_if == 'not_exists': - assert(not local) - body += 'constr:(%(name)s)' % locals() - body = body.strip('\n ').replace('\n', '\n ') - ret += r''' -%(indent)s Tag.update_by_tac_if_not_exists -%(indent)s pkg -%(indent)s TAG.%(name)s -%(indent)s ltac:(fun _ => %(body)s).''' % locals() - else: - if isinstance(only_if, tuple) and 'not_exists' in only_if: - only_if = [i for i in only_if if i != 'not_exists'] - assert(len(only_if) == 1) - only_if = only_if[0] - body += 'constr:(%(name)s)' % locals() - body = body.strip('\n ').replace('\n', '\n ') - body = r'''Tag.update_by_tac_if_not_exists -%(indent)s pkg -%(indent)s TAG.%(name)s -%(indent)s ltac:(fun _ => %(body)s).''' % locals() - else: - body += r'''Tag.%(local_str)supdate pkg TAG.%(name)s %(name)s''' % locals() - if only_if is None: - ret += body + '.\n' - else: - body = body.strip('\n .').replace('\n', '\n ') - ret += r''' -%(indent)s if_%(only_if)s -%(indent)s pkg -%(indent)s ltac:(fun _ => %(body)s) -%(indent)s ltac:(fun _ => pkg) -%(indent)s ().''' % locals() - return ret - -def make_add_all(fname, indent=''): - modname, ext = os.path.splitext(os.path.basename(fname)) - all_items = [(name, split_args(name, args_str, indent=indent)) for name, args_str, local in fns[fname]] - all_pass_args = [] - for name, (args, pass_args, extract_args, pass_args_str, extract_args_str) in all_items: - for arg in pass_args: - if arg not in all_pass_args: all_pass_args.append(arg) - all_pass_args_str = ' '.join(all_pass_args) - if all_pass_args_str != '': all_pass_args_str += ' ' - ret = r'''%(indent)sLtac add_%(modname)s_package pkg %(all_pass_args_str)s:=''' % locals() - nl_indent = ('\n%(indent)s ' % locals()) - ret += nl_indent + nl_indent.join('let pkg := add_%s pkg %sin' % (name, pass_args_str) - for name, (args, pass_args, extract_args, pass_args_str, extract_args_str) in all_items) - ret += nl_indent + 'Tag.strip_subst_local pkg.\n' - return ret - -def make_if(name, indent=''): - ret = r'''%(indent)sLtac if_%(name)s pkg tac_true tac_false arg := -%(indent)s let %(name)s := Tag.get pkg TAG.%(name)s in -%(indent)s let %(name)s := (eval vm_compute in (%(name)s : bool)) in -%(indent)s lazymatch %(name)s with -%(indent)s | true => tac_true arg -%(indent)s | false => tac_false arg -%(indent)s end. -''' % locals() - return ret - -def write_if_changed(fname, value): - if os.path.isfile(fname): - with open(fname, 'r') as f: - old_value = f.read() - if old_value == value: return - value = unicode(value) - print('Writing %s...' % fname) - with io.open(fname, 'w', newline='\n') as f: - f.write(value) - -def do_replace(fname, headers, new_contents): - lines = contents[fname].split('\n') - ret = [] - for line in lines: - if any(header in line for header in headers): - ret.append(new_contents) - break - else: - ret.append(line) - ret = unicode('\n'.join(ret)) - write_if_changed(fname, ret) - -def get_existing_tags(fname, deps): - return set(name for dep in deps for name, args, local in fns[dep.replace('Package.v', '.v')]) - -def make_package(fname, deps, extra_modname_prefix='', extra_imports=None, prefix=None, add_package=True): - py_file_name = PY_FILE_NAME - existing_tags = get_existing_tags(fname, deps) - full_mod = modname_of_file_name(fname) - modname, ext = os.path.splitext(os.path.basename(fname)) - ret = (r'''(* This file is autogenerated from %(modname)s.v by %(py_file_name)s *) -''' % locals()) - if extra_imports is not None: - ret += extra_imports - ret += (r'''Require Export %(full_mod)s. -Require Import Crypto.Specific.Framework.Packages. -Require Import Crypto.Util.TagList. -''' % locals()) - if prefix is not None: - ret += prefix - new_names = [name for name, args, local in fns[fname] if name not in existing_tags and not local] - if add_package: # and len(new_names) > 0: - ret += (r''' - -Module Make%(extra_modname_prefix)s%(modname)sPackage (PKG : PrePackage). - Module Import Make%(extra_modname_prefix)s%(modname)sPackageInternal := MakePackageBase PKG. -''' % locals()) - for name in new_names: - ret += ("\n Ltac get_%s _ := get TAG.%s." % (name, name)) - ret += ("\n Notation %s := (ltac:(let v := get_%s () in exact v)) (only parsing)." % (name, name)) - ret += ('\nEnd Make%(extra_modname_prefix)s%(modname)sPackage.\n' % locals()) - return ret - -def make_tags(fname, deps): - existing_tags = get_existing_tags(fname, deps) - new_tags = [name for name, args, local in fns[fname] if name not in existing_tags] - if len(new_tags) == 0: return '' - names = ' | '.join(new_tags) - return r'''Module TAG. - Inductive tags := %s. -End TAG. -''' % names - -def write_package(fname, pkg): - pkg_name = fname[:-2] + 'Package.v' - write_if_changed(pkg_name, pkg) - -def update_CurveParameters(fname='../CurveParameters.v'): - endline = contents[fname].strip().split('\n')[-1] - assert(endline.startswith('End ')) - header = '(* Everything below this line autogenerated by %s *)' % PY_FILE_NAME - assert(header in contents[fname]) - ret = ' %s' % header - for name, args, local in fns[fname]: - ret += '\n' + make_add_from_pose(name, args, indent=' ', local=local) - ret += '\n' + make_add_all(fname, indent=' ') - ret += endline + '\n' - prefix = '' - for name in CONFIGS: - prefix += '\n' + make_if(name, indent='') - pkg = make_package(fname, [], prefix=prefix) - do_replace(fname, (header,), ret) - write_package(fname, pkg) - -def make_normal_package(fname, deps, only_if=None): - prefix = '' - extra_imports = '' - for dep in deps: - extra_imports += 'Require Import %s.\n' % modname_of_file_name(dep) - prefix += '\n' + make_tags(fname, deps) - for name, args, local in fns[fname]: - prefix += '\n' + make_add_from_pose(name, args, indent='', only_if=only_if, local=local) - prefix += '\n' + make_add_all(fname, indent='') - return make_package(fname, deps, extra_imports=extra_imports, prefix=prefix) - -def update_normal_package(fname, deps, only_if=None): - pkg = make_normal_package(fname, deps, only_if=only_if) - write_package(fname, pkg) - -root = get_file_root() -init_contents() -init_fns() -update_CurveParameters() -for fname, (deps, only_if) in NORMAL_PACKAGE_NAMES: - update_normal_package(fname, deps, only_if=only_if) |