aboutsummaryrefslogtreecommitdiff
path: root/src/Specific/Framework/ArithmeticSynthesis/KaratsubaPackage.v
blob: 197c9431bf6e703c6ee41377a7d33ff99327720a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
(* This file is autogenerated from Karatsuba.v by remake_packages.py *)
Require Import Crypto.Specific.Framework.CurveParametersPackage.
Require Import Crypto.Specific.Framework.ArithmeticSynthesis.BasePackage.
Require Import Crypto.Specific.Framework.ArithmeticSynthesis.DefaultsPackage.
Require Export Crypto.Specific.Framework.ArithmeticSynthesis.Karatsuba.
Require Import Crypto.Specific.Framework.Packages.
Require Import Crypto.Util.TagList.

Module TAG.
  Inductive tags := half_sz_nonzero.
End TAG.

Ltac add_half_sz_nonzero pkg :=
  if_goldilocks
    pkg
    ltac:(fun _ => let half_sz := Tag.get pkg TAG.half_sz in
                   let half_sz_nonzero := fresh "half_sz_nonzero" in
                   let half_sz_nonzero := pose_half_sz_nonzero half_sz half_sz_nonzero in
                   Tag.update pkg TAG.half_sz_nonzero half_sz_nonzero)
    ltac:(fun _ => pkg)
    ().
Ltac add_mul_sig pkg :=
  if_goldilocks
    pkg
    ltac:(fun _ => let wt := Tag.get pkg TAG.wt in
                   let m := Tag.get pkg TAG.m in
                   let base := Tag.get pkg TAG.base in
                   let sz := Tag.get pkg TAG.sz in
                   let s := Tag.get pkg TAG.s in
                   let c := Tag.get pkg TAG.c in
                   let half_sz := Tag.get pkg TAG.half_sz in
                   let mul_sig := fresh "mul_sig" in
                   let mul_sig := pose_mul_sig wt m base sz s c half_sz mul_sig in
                   Tag.update pkg TAG.mul_sig mul_sig)
    ltac:(fun _ => pkg)
    ().
Ltac add_square_sig pkg :=
  if_goldilocks
    pkg
    ltac:(fun _ => let sz := Tag.get pkg TAG.sz in
                   let m := Tag.get pkg TAG.m in
                   let wt := Tag.get pkg TAG.wt in
                   let mul_sig := Tag.get pkg TAG.mul_sig in
                   let square_sig := fresh "square_sig" in
                   let square_sig := pose_square_sig sz m wt mul_sig square_sig in
                   Tag.update pkg TAG.square_sig square_sig)
    ltac:(fun _ => pkg)
    ().
Ltac add_Karatsuba_package pkg :=
  let pkg := add_half_sz_nonzero pkg in
  let pkg := add_mul_sig pkg in
  let pkg := add_square_sig pkg in
  Tag.strip_subst_local pkg.


Module MakeKaratsubaPackage (PKG : PrePackage).
  Module Import MakeKaratsubaPackageInternal := MakePackageBase PKG.

  Ltac get_half_sz_nonzero _ := get TAG.half_sz_nonzero.
  Notation half_sz_nonzero := (ltac:(let v := get_half_sz_nonzero () in exact v)) (only parsing).
End MakeKaratsubaPackage.