ddc-driver-0.4.3.1: DDC/Driver/Stage/Tetra.hs
module DDC.Driver.Stage.Tetra
( stageSourceTetraLoad
, stageTetraLoad
, stageTetraToSalt)
where
import DDC.Driver.Dump
import DDC.Driver.Config
import DDC.Driver.Interface.Source
import DDC.Build.Interface.Store (Store)
import DDC.Build.Pipeline
import DDC.Data.Pretty
import qualified DDC.Build.Language.Tetra as BE
import qualified DDC.Build.Builder as B
import qualified DDC.Core.Tetra as CE
import qualified DDC.Core.Salt as CS
import qualified DDC.Core.Check as C
import qualified DDC.Core.Simplifier.Recipe as C
import qualified DDC.Core.Transform.Namify as C
import qualified DDC.Control.Parser as BP
---------------------------------------------------------------------------------------------------
-- | Load and type check a Source Tetra module.
stageSourceTetraLoad
:: Config -> Source
-> Store
-> [PipeCore (C.AnTEC BP.SourcePos CE.Name) CE.Name]
-> PipeText CE.Name CE.Error
stageSourceTetraLoad config source store pipesTetra
= PipeTextLoadSourceTetra
(dump config source "dump.0-source-01-tokens.txt")
(dump config source "dump.0-source-02-parsed.dst")
(dump config source "dump.0-source-03-fresh.dst")
(dump config source "dump.0-source-04-defix.dst")
(dump config source "dump.0-source-05-expand.dst")
(dump config source "dump.0-source-06-guards.dst")
(dump config source "dump.0-source-07-matches.dst")
(dump config source "dump.0-source-08-prep.dst")
(dump config source "dump.0-source-09-core.dct")
(dump config source "dump.0-source-10-precheck.dct")
(dump config source "dump.0-source-11-trace.txt")
store
( PipeCoreOutput pprDefaultMode
(dump config source "dump.1-tetra-00-checked.dct")
: pipesTetra )
---------------------------------------------------------------------------------------------------
-- | Load and type check a Core Tetra module.
stageTetraLoad
:: Config -> Source
-> [PipeCore () CE.Name]
-> PipeText CE.Name CE.Error
stageTetraLoad config source pipesTetra
= PipeTextLoadCore BE.fragment
(if configInferTypes config then C.Synth [] else C.Recon)
(dump config source "dump.1-tetra-00-check.dct")
[ PipeCoreReannotate (const ())
( PipeCoreOutput pprDefaultMode
(dump config source "dump.1-tetra-01-load.dct")
: pipesTetra ) ]
---------------------------------------------------------------------------------------------------
-- | Convert a Core Tetra module to Core Salt.
--
-- This includes performing the Boxing transform.
---
-- The Tetra to Salt transform requires the program to be normalised,
-- and have type annotations.
stageTetraToSalt
:: Config -> Source
-> [PipeCore () CS.Name]
-> PipeCore () CE.Name
stageTetraToSalt config source pipesSalt
= pipe_lambdas
where
pipe_lambdas
= PipeCoreCheck BE.fragment C.Recon SinkDiscard
[ PipeCoreSimplify BE.fragment (0 :: Int) C.lambdas
[ PipeCoreOutput pprDefaultMode
(dump config source "dump.1-tetra-02-lambdas.dct")
, pipe_curry]]
pipe_curry
= PipeCoreCheck BE.fragment C.Recon SinkDiscard
[ PipeCoreAsTetra
[ PipeTetraCurry (dump config source "dump.1-tetra-03-unshare.dct")
[ PipeCoreOutput pprDefaultMode
(dump config source "dump.1-tetra-04-curry.dct")
, pipe_prep ]]]
pipe_prep
= PipeCoreSimplify BE.fragment 0 normalize
[ pipe_boxing ]
normalize
= C.anormalize
(C.makeNamifier CE.freshT)
(C.makeNamifier CE.freshX)
pipe_boxing
= PipeCoreAsTetra
[ PipeTetraBoxing
[ PipeCoreOutput pprDefaultMode
(dump config source "dump.1-tetra-05-boxing-raw.dct")
, PipeCoreSimplify BE.fragment 0 (normalize `mappend` C.flatten)
[ PipeCoreOutput pprDefaultMode
(dump config source "dump.1-tetra-06-boxing-simp.dct")
, pipe_toSalt]]]
pipe_toSalt
= PipeCoreCheck BE.fragment C.Recon SinkDiscard
[ PipeCoreAsTetra
[ PipeTetraToSalt (B.buildSpec $ configBuilder config)
(configRuntime config)
( PipeCoreOutput pprDefaultMode
(dump config source "dump.2-salt-00-convert.dcs")
: pipesSalt)]]