import Lake
open Lake DSL
open System

package «SilverSight» where
  -- Settings applied to both builds and interactive editing
  leanOptions := #[
    ⟨`pp.unicode.fun, true⟩ -- pretty-prints `fun a ↦ b`
  ]
  -- Add any additional package configuration options here

@[default_target]
lean_lib «SilverSightCore» where
  -- Add any library configuration options here
  srcDir := "Core"
  roots := #[`SilverSightCore, `SilverSight.FixedPoint, `SilverSight.Semantics.Schema, `SilverSight.Semantics.Layout, `SilverSight.Semantics.WireFormat, `SilverSight.Semantics.View, `SilverSight.Semantics.LayoutBridge, `SilverSight.Semantics.CanalLayout]

lean_lib «SilverSightFormal» where
  srcDir := "formal"
  roots := #[
    `CoreFormalism.FixedPoint,
    `CoreFormalism.Tactics,
    `CoreFormalism.Q16_16Numerics,
    `CoreFormalism.DynamicCanal,
    `CoreFormalism.Bind,
    `CoreFormalism.BraidBracket,
    `CoreFormalism.BraidStrand,
    `CoreFormalism.BraidCross,
    `CoreFormalism.BraidField,
    `CoreFormalism.SidonSets,
    `CoreFormalism.SieveLemmas,
    `CoreFormalism.InteractionGraphSidon,
    `CoreFormalism.BraidEigensolid,
    `CoreFormalism.BraidSpherionBridge,
    `CoreFormalism.ChentsovFinite,
    `CoreFormalism.HachimojiBase,
    `CoreFormalism.HachimojiManifoldAxiom,
    `CoreFormalism.HachimojiCodec,
    `CoreFormalism.HachimojiLUT,
    `CoreFormalism.HachimojiBridging
  ]

lean_lib «SilverSightRRC» where
  srcDir := "formal"
  roots := #[
    `SilverSight.PIST.Spectral,
    `SilverSight.PIST.Classify,
    `SilverSight.PIST.Matrices250,
    `SilverSight.RRCLogogramProjection,
    `SilverSight.ReceiptCore,
    `SilverSight.RRC.Emit,
    `SilverSight.RRC.ReceiptDensity,
    `SilverSight.RRC.PolyFactorIdentity,
    `SilverSight.RRC.EntropyCandidates,
    `SilverSight.RRC.Corpus250,
    `SilverSight.AVMIsa.Types,
    `SilverSight.AVMIsa.Value,
    `SilverSight.AVMIsa.Instr,
    `SilverSight.AVMIsa.State,
    `SilverSight.AVMIsa.Step,
    `SilverSight.AVMIsa.Run,
    `SilverSight.AVMIsa.Emit
  ]

lean_exe «rrc-emit-fixture» where
  root := `RrcEmitFixture
  srcDir := "exe"

lean_exe «q16-roundtrip» where
  root := `Q16_16Roundtrip
  srcDir := "exe"

-- Static C library for the Q16_16 roundtrip executable.
def cSrcDir : FilePath := FilePath.mk "c"

target q16_canonical.o pkg : FilePath := do
  let oFile := pkg.buildDir / cSrcDir / "q16_canonical.o"
  let srcJob ← inputFile (pkg.srcDir / cSrcDir / "q16_canonical.c") true
  let flags := #["-fPIC", "-O2"]
  buildO oFile srcJob flags

extern_lib q16_canonical pkg := do
  let name := nameToStaticLib "q16_canonical"
  let libFile := pkg.buildDir / cSrcDir / name
  let oJob ← fetch <| pkg.target ``q16_canonical.o
  buildStaticLib libFile #[oJob]

require mathlib from git
  "https://github.com/leanprover-community/mathlib4.git"
