1 import Base 2 import ../kernel_spatial_packing.bend as Packing 3 import ../kernel_tile.bend as Tile 4 import ./kernel_packing_witness.bend as PackingWitness 5 import ./storage_tree_model.bend as Tree 6 import ./storage_certificate.bend as Certificate 7 import ./traversal_witness.bend as TraversalWitness 8 import ./traversal_certificate.bend as TraversalCertificate 9 10 type WindowCall is Data: 11 WindowCall{window: Packing.Stencil,count: Nat,start: U32} 12 13 def window_operation(call: WindowCall,input: Array,output: Array) -> Array & Array: 14 WindowCall{window,count,start} = call 15 Packing.pack_window(window,count,start,input,output) 16 17 def window_preserves(+depth: Nat,call: WindowCall,-input: Array,-output: Array,input_certificate: Certificate.Certificate, 18 equation: {output == Tree.pack(Tile.Tile8,Certificate.normalized(Tile.Tile8,depth,Tree.reflect(Tile.Tile8,output))) : Array}) -> 19 TraversalWitness.ResultEvidence,Tile.Tile8,input,depth,window_operation(call,input,output)>: 20 WindowCall{window,count,start} = call 21 PackingWitness.pack_window(depth,window,count,start,input,output,Certificate.witness(F32,input,input_certificate),Certificate.witness_at(Tile.Tile8,depth,output,equation)) 22 23 def window_certificates(window: Packing.Stencil,count: Nat,start: U32,-input: Array,-output: Array,input_certificate: Certificate.Certificate,output_certificate: Certificate.Certificate) -> 24 TraversalCertificate.Certificates,Tile.Tile8,Certificate.family(~F32),Packing.pack_window(window,count,start,input,output)>: 25 Certificate.Certificate{+depth,+equation} = input_certificate 26 TraversalCertificate.operation(~Array,~Tile.Tile8,~WindowCall,~Certificate.family(~F32),~window_operation,~window_preserves, 27 WindowCall{window,count,start},input,output,Certificate.Certificate{depth,equation},Certificate.Certificate{depth,equation},Certificate.Certificate{depth,equation},output_certificate) 28 29 def preserves(+depth: Nat,call: Packing.Call,-input: Array,-output: Array,input_certificate: Certificate.Certificate, 30 equation: {output == Tree.pack(Tile.Tile8,Certificate.normalized(Tile.Tile8,depth,Tree.reflect(Tile.Tile8,output))) : Array}) -> 31 TraversalWitness.ResultEvidence,Tile.Tile8,input,depth,Packing.run(call,input,output)>: 32 Packing.Call{+count,+start,+h,+w,+k,+s,+p,+ow,+inner} = call 33 PackingWitness.pack(depth,count,start,input,output,h,w,k,s,p,ow,inner,Certificate.witness(F32,input,input_certificate),Certificate.witness_at(Tile.Tile8,depth,output,equation)) 34 35 def certificates(call: Packing.Call,-input: Array,-output: Array,input_certificate: Certificate.Certificate,output_certificate: Certificate.Certificate) -> 36 TraversalCertificate.Certificates,Tile.Tile8,Certificate.family(~F32),Packing.run(call,input,output)>: 37 Certificate.Certificate{+depth,+equation} = input_certificate 38 TraversalCertificate.operation(~Array,~Tile.Tile8,~Packing.Call,~Certificate.family(~F32),~Packing.run,~preserves, 39 call,input,output,Certificate.Certificate{depth,equation},Certificate.Certificate{depth,equation},Certificate.Certificate{depth,equation},output_certificate)