Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support compilation of Anoma transactions in nockma backend #2693

Merged
merged 37 commits into from
Mar 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
e70df20
transactions wip
paulcadman Mar 8, 2024
ab57f16
fix placeholder
janmasrovira Mar 8, 2024
4900512
wip
janmasrovira Mar 8, 2024
10892d0
compile and run `length [1] == 1`
janmasrovira Mar 8, 2024
f860274
write some tests
janmasrovira Mar 8, 2024
fc971bc
end of the day
janmasrovira Mar 8, 2024
c2aa9c0
remove Juvix calling convention and fix 'list to tuple'
janmasrovira Mar 8, 2024
c7f78bf
comment out debug writeFile
janmasrovira Mar 8, 2024
6480be6
add some unit tests
janmasrovira Mar 9, 2024
d1fb418
fix foldTermsOrNil
janmasrovira Mar 9, 2024
fbc59b4
put quotes
janmasrovira Mar 9, 2024
ac59212
fixing bugs
janmasrovira Mar 9, 2024
a03ddb6
improving traces
janmasrovira Mar 9, 2024
3deffe4
add tag to atoms
janmasrovira Mar 14, 2024
0a7446c
check atomHint when parsing NockOp
janmasrovira Mar 14, 2024
30898ab
nockNilTagged, fix allocClosure
janmasrovira Mar 14, 2024
6464b1c
add optIgnoreTags option to prettyprinter
janmasrovira Mar 14, 2024
521aab5
define opReplace
janmasrovira Mar 15, 2024
a70effd
fix replacement of extensions
janmasrovira Mar 15, 2024
29cb539
Remove TargetNockma
paulcadman Mar 18, 2024
3968f3a
Remove unsafePerformIO
paulcadman Mar 18, 2024
fb55f96
Remove unused ProgramCallingConvention
paulcadman Mar 18, 2024
27feb8b
Export runCompilerWith'
paulcadman Mar 18, 2024
c3eae37
Update test/Nockma/Eval/Positive.hs
paulcadman Mar 19, 2024
6f0679c
Fix handling of appendRights in listToTuple
paulcadman Mar 19, 2024
f65c249
Add dev nockma run command to run Anoma programs with an env
paulcadman Mar 18, 2024
66caa90
Fix after rebase
paulcadman Mar 22, 2024
984f3da
Fix nockma parsing of stdlib idents
paulcadman Mar 22, 2024
05470e0
Output pretty version of nockma
paulcadman Mar 22, 2024
67fcbfe
Allow any ascii char in a nockma iden
paulcadman Mar 22, 2024
3b0d7d7
inline the env in every closure
janmasrovira Mar 15, 2024
e9835c8
Support passing of arguments to dev nockma run
paulcadman Mar 18, 2024
f509c98
Add anoma compile negative test for strings
paulcadman Mar 19, 2024
051a52a
Fix formatting
paulcadman Mar 22, 2024
a693f45
Fix after rebase
paulcadman Mar 22, 2024
c938a66
Parse nockma functionsPlaceholder atom
paulcadman Mar 22, 2024
f45f2c3
Remove comment
paulcadman Mar 22, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion app/Commands/Compile.hs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ runCommand opts@CompileOptions {..} = do
TargetTree -> Compile.runTreePipeline arg
TargetAsm -> Compile.runAsmPipeline arg
TargetReg -> Compile.runRegPipeline arg
TargetNockma -> Compile.runNockmaPipeline arg
TargetAnoma -> Compile.runAnomaPipeline arg
TargetCasm -> Compile.runCasmPipeline arg

Expand Down
1 change: 0 additions & 1 deletion app/Commands/Dev/Asm/Compile.hs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@ runCommand opts = do
TargetNative64 -> return Backend.TargetCNative64
TargetReg -> return Backend.TargetReg
TargetCasm -> return Backend.TargetCairo
TargetNockma -> err "Nockma"
TargetAnoma -> err "Anoma"
TargetTree -> err "JuvixTree"
TargetGeb -> err "GEB"
Expand Down
1 change: 0 additions & 1 deletion app/Commands/Dev/Core/Compile.hs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ runCommand opts = do
TargetAsm -> runAsmPipeline arg
TargetReg -> runRegPipeline arg
TargetTree -> runTreePipeline arg
TargetNockma -> runNockmaPipeline arg
TargetAnoma -> runAnomaPipeline arg
TargetCasm -> runCasmPipeline arg
where
Expand Down
21 changes: 3 additions & 18 deletions app/Commands/Dev/Core/Compile/Base.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ module Commands.Dev.Core.Compile.Base where

import Commands.Base
import Commands.Dev.Core.Compile.Options
import Commands.Dev.Tree.Compile.Base (outputAnomaResult)
import Commands.Extra.Compile qualified as Compile
import Juvix.Compiler.Asm.Pretty qualified as Asm
import Juvix.Compiler.Backend qualified as Backend
Expand All @@ -12,7 +13,6 @@ import Juvix.Compiler.Casm.Data.Result qualified as Casm
import Juvix.Compiler.Casm.Pretty qualified as Casm
import Juvix.Compiler.Core.Data.Module qualified as Core
import Juvix.Compiler.Core.Data.TransformationId qualified as Core
import Juvix.Compiler.Nockma.Pretty qualified as Nockma
import Juvix.Compiler.Reg.Pretty qualified as Reg
import Juvix.Compiler.Tree.Pretty qualified as Tree
import Juvix.Prelude.Pretty
Expand Down Expand Up @@ -46,7 +46,6 @@ getEntry PipelineArg {..} = do
TargetAsm -> Backend.TargetAsm
TargetReg -> Backend.TargetReg
TargetTree -> Backend.TargetTree
TargetNockma -> Backend.TargetNockma
TargetAnoma -> Backend.TargetAnoma
TargetCasm -> Backend.TargetCairo

Expand Down Expand Up @@ -147,19 +146,6 @@ runTreePipeline pa@PipelineArg {..} = do
let code = Tree.ppPrint tab' tab'
writeFileEnsureLn treeFile code

runNockmaPipeline :: (Members '[EmbedIO, App, TaggedLock] r) => PipelineArg -> Sem r ()
runNockmaPipeline pa@PipelineArg {..} = do
entryPoint <- getEntry pa
nockmaFile <- Compile.outputFile _pipelineArgOptions _pipelineArgFile
r <-
runReader entryPoint
. runError @JuvixError
. coreToNockma
$ _pipelineArgModule
tab' <- getRight r
let code = Nockma.ppSerialize tab'
writeFileEnsureLn nockmaFile code

runAnomaPipeline :: (Members '[EmbedIO, App, TaggedLock] r) => PipelineArg -> Sem r ()
runAnomaPipeline pa@PipelineArg {..} = do
entryPoint <- getEntry pa
Expand All @@ -169,9 +155,8 @@ runAnomaPipeline pa@PipelineArg {..} = do
. runError @JuvixError
. coreToAnoma
$ _pipelineArgModule
tab' <- getRight r
let code = Nockma.ppSerialize tab'
writeFileEnsureLn nockmaFile code
res <- getRight r
outputAnomaResult nockmaFile res

runCasmPipeline :: (Members '[EmbedIO, App, TaggedLock] r) => PipelineArg -> Sem r ()
runCasmPipeline pa@PipelineArg {..} = do
Expand Down
2 changes: 2 additions & 0 deletions app/Commands/Dev/Nockma.hs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ import Commands.Dev.Nockma.Eval as Eval
import Commands.Dev.Nockma.Format as Format
import Commands.Dev.Nockma.Options
import Commands.Dev.Nockma.Repl as Repl
import Commands.Dev.Nockma.Run as Run

runCommand :: forall r. (Members '[EmbedIO, App] r) => NockmaCommand -> Sem r ()
runCommand = \case
NockmaRepl opts -> Repl.runCommand opts
NockmaEval opts -> Eval.runCommand opts
NockmaFormat opts -> Format.runCommand opts
NockmaRun opts -> Run.runCommand opts
9 changes: 6 additions & 3 deletions app/Commands/Dev/Nockma/Eval.hs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module Commands.Dev.Nockma.Eval where
import Commands.Base hiding (Atom)
import Commands.Dev.Nockma.Eval.Options
import Juvix.Compiler.Nockma.EvalCompiled
import Juvix.Compiler.Nockma.Evaluator.Options
import Juvix.Compiler.Nockma.Evaluator
import Juvix.Compiler.Nockma.Pretty
import Juvix.Compiler.Nockma.Translation.FromSource qualified as Nockma

Expand All @@ -14,11 +14,14 @@ runCommand opts = do
case parsedTerm of
Left err -> exitJuvixError (JuvixError err)
Right (TermCell c) -> do
res <-
runReader defaultEvalOptions
(counts, res) <-
runOpCounts
. runReader defaultEvalOptions
. runOutputSem @(Term Natural) (say . ppTrace)
$ evalCompiledNock' (c ^. cellLeft) (c ^. cellRight)
putStrLn (ppPrint res)
let statsFile = replaceExtension' ".profile" afile
writeFileEnsureLn statsFile (prettyText counts)
Right TermAtom {} -> exitFailMsg "Expected nockma input to be a cell"
where
file :: AppPath File
Expand Down
10 changes: 8 additions & 2 deletions app/Commands/Dev/Nockma/Eval/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ module Commands.Dev.Nockma.Eval.Options where

import CommonOptions

newtype NockmaEvalOptions = NockmaEvalOptions
{ _nockmaEvalFile :: AppPath File
data NockmaEvalOptions = NockmaEvalOptions
{ _nockmaEvalFile :: AppPath File,
_nockmaEvalProfile :: Bool
}
deriving stock (Data)

Expand All @@ -12,4 +13,9 @@ makeLenses ''NockmaEvalOptions
parseNockmaEvalOptions :: Parser NockmaEvalOptions
parseNockmaEvalOptions = do
_nockmaEvalFile <- parseInputFile FileExtNockma
_nockmaEvalProfile <-
switch
( long "profile"
<> help "Report evaluator profiling statistics"
)
pure NockmaEvalOptions {..}
14 changes: 13 additions & 1 deletion app/Commands/Dev/Nockma/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ module Commands.Dev.Nockma.Options where
import Commands.Dev.Nockma.Eval.Options
import Commands.Dev.Nockma.Format.Options
import Commands.Dev.Nockma.Repl.Options
import Commands.Dev.Nockma.Run.Options
import CommonOptions

data NockmaCommand
= NockmaRepl NockmaReplOptions
| NockmaEval NockmaEvalOptions
| NockmaFormat NockmaFormatOptions
| NockmaRun NockmaRunOptions
deriving stock (Data)

parseNockmaCommand :: Parser NockmaCommand
Expand All @@ -17,9 +19,19 @@ parseNockmaCommand =
mconcat
[ commandRepl,
commandFromAsm,
commandFormat
commandFormat,
commandRun
]
where
commandRun :: Mod CommandFields NockmaCommand
commandRun = command "run" runInfo
where
runInfo :: ParserInfo NockmaCommand
runInfo =
info
(NockmaRun <$> parseNockmaRunOptions)
(progDesc "Run an Anoma program. It should be used with artefacts obtained from compilation with the anoma target.")

commandFromAsm :: Mod CommandFields NockmaCommand
commandFromAsm = command "eval" fromAsmInfo
where
Expand Down
37 changes: 37 additions & 0 deletions app/Commands/Dev/Nockma/Run.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
module Commands.Dev.Nockma.Run where

import Commands.Base hiding (Atom)
import Commands.Dev.Nockma.Run.Options
import Juvix.Compiler.Nockma.Anoma
import Juvix.Compiler.Nockma.EvalCompiled
import Juvix.Compiler.Nockma.Evaluator
import Juvix.Compiler.Nockma.Pretty
import Juvix.Compiler.Nockma.Translation.FromSource qualified as Nockma
import Juvix.Parser.Error

runCommand :: forall r. (Members '[EmbedIO, App] r) => NockmaRunOptions -> Sem r ()
runCommand opts = do
afile <- fromAppPathFile inputFile
argsFile <- mapM fromAppPathFile (opts ^. nockmaRunArgs)
parsedArgs <- mapM (Nockma.parseTermFile >=> checkParsed) argsFile
parsedTerm <- Nockma.parseTermFile afile >>= checkParsed
case parsedTerm of
t@(TermCell {}) -> do
let formula = anomaCallTuple parsedArgs
(counts, res) <-
runOpCounts
. runReader defaultEvalOptions
. runOutputSem @(Term Natural) (say . ppTrace)
$ evalCompiledNock' t formula
putStrLn (ppPrint res)
let statsFile = replaceExtension' ".profile" afile
writeFileEnsureLn statsFile (prettyText counts)
TermAtom {} -> exitFailMsg "Expected nockma input to be a cell"
where
inputFile :: AppPath File
inputFile = opts ^. nockmaRunFile

checkParsed :: Either MegaparsecError (Term Natural) -> Sem r (Term Natural)
checkParsed = \case
Left err -> exitJuvixError (JuvixError err)
Right tm -> return tm
32 changes: 32 additions & 0 deletions app/Commands/Dev/Nockma/Run/Options.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
module Commands.Dev.Nockma.Run.Options where

import CommonOptions

data NockmaRunOptions = NockmaRunOptions
{ _nockmaRunFile :: AppPath File,
_nockmaRunProfile :: Bool,
_nockmaRunArgs :: Maybe (AppPath File)
}
deriving stock (Data)

makeLenses ''NockmaRunOptions

parseNockmaRunOptions :: Parser NockmaRunOptions
parseNockmaRunOptions = do
_nockmaRunFile <- parseInputFile FileExtNockma
_nockmaRunArgs <- optional $ do
_pathPath <-
option
somePreFileOpt
( long "args"
<> metavar "ARGS_FILE"
<> help "Path to file containing args"
<> action "file"
)
pure AppPath {_pathIsInput = True, ..}
_nockmaRunProfile <-
switch
( long "profile"
<> help "Report evaluator profiling statistics"
)
pure NockmaRunOptions {..}
1 change: 0 additions & 1 deletion app/Commands/Dev/Reg/Compile.hs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ runCommand opts = do
TargetNative64 -> return Backend.TargetCNative64
TargetCasm -> return Backend.TargetCairo
TargetReg -> err "JuvixReg"
TargetNockma -> err "Nockma"
TargetAnoma -> err "Anoma"
TargetTree -> err "JuvixTree"
TargetGeb -> err "GEB"
Expand Down
1 change: 0 additions & 1 deletion app/Commands/Dev/Tree/Compile.hs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ runCommand opts = do
TargetAsm -> runAsmPipeline arg
TargetReg -> runRegPipeline arg
TargetTree -> return ()
TargetNockma -> runNockmaPipeline arg
TargetAnoma -> runAnomaPipeline arg
TargetCasm -> runCasmPipeline arg
where
Expand Down
25 changes: 9 additions & 16 deletions app/Commands/Dev/Tree/Compile/Base.hs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import Juvix.Compiler.Backend.C qualified as C
import Juvix.Compiler.Casm.Data.Result qualified as Casm
import Juvix.Compiler.Casm.Pretty qualified as Casm
import Juvix.Compiler.Nockma.Pretty qualified as Nockma
import Juvix.Compiler.Nockma.Translation.FromTree qualified as Nockma
import Juvix.Compiler.Reg.Pretty qualified as Reg
import Juvix.Compiler.Tree.Data.InfoTable qualified as Tree
import Juvix.Prelude.Pretty
Expand Down Expand Up @@ -41,7 +42,6 @@ getEntry PipelineArg {..} = do
TargetAsm -> Backend.TargetAsm
TargetReg -> Backend.TargetReg
TargetTree -> Backend.TargetTree
TargetNockma -> Backend.TargetNockma
TargetAnoma -> Backend.TargetAnoma
TargetCasm -> Backend.TargetCairo

Expand Down Expand Up @@ -104,19 +104,6 @@ runRegPipeline pa@PipelineArg {..} = do
let code = Reg.ppPrint tab' tab'
writeFileEnsureLn regFile code

runNockmaPipeline :: (Members '[EmbedIO, App, TaggedLock] r) => PipelineArg -> Sem r ()
runNockmaPipeline pa@PipelineArg {..} = do
entryPoint <- getEntry pa
nockmaFile <- Compile.outputFile _pipelineArgOptions _pipelineArgFile
r <-
runReader entryPoint
. runError @JuvixError
. treeToNockma
$ _pipelineArgTable
tab' <- getRight r
let code = Nockma.ppSerialize tab'
writeFileEnsureLn nockmaFile code

runAnomaPipeline :: (Members '[EmbedIO, App, TaggedLock] r) => PipelineArg -> Sem r ()
runAnomaPipeline pa@PipelineArg {..} = do
entryPoint <- getEntry pa
Expand All @@ -126,9 +113,15 @@ runAnomaPipeline pa@PipelineArg {..} = do
. runError @JuvixError
. treeToAnoma
$ _pipelineArgTable
tab' <- getRight r
let code = Nockma.ppSerialize tab'
res <- getRight r
outputAnomaResult nockmaFile res

outputAnomaResult :: (Members '[EmbedIO, App] r) => Path Abs File -> Nockma.AnomaResult -> Sem r ()
outputAnomaResult nockmaFile Nockma.AnomaResult {..} = do
let code = Nockma.ppSerialize _anomaClosure
prettyNockmaFile = replaceExtensions' [".pretty", ".nockma"] nockmaFile
writeFileEnsureLn nockmaFile code
writeFileEnsureLn prettyNockmaFile (Nockma.ppPrint _anomaClosure)

runCasmPipeline :: (Members '[EmbedIO, App, TaggedLock] r) => PipelineArg -> Sem r ()
runCasmPipeline pa@PipelineArg {..} = do
Expand Down
4 changes: 2 additions & 2 deletions app/Commands/Dev/Tree/Compile/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ treeSupportedTargets =
TargetNative64,
TargetAsm,
TargetReg,
TargetNockma,
TargetCasm
TargetCasm,
TargetAnoma
]

parseTreeCompileOptions :: Parser CompileOptions
Expand Down
4 changes: 0 additions & 4 deletions app/Commands/Extra/Compile.hs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ runCompile inputFile o = do
TargetAsm -> return (Right ())
TargetReg -> return (Right ())
TargetTree -> return (Right ())
TargetNockma -> return (Right ())
TargetAnoma -> return (Right ())
TargetCasm -> return (Right ())

Expand All @@ -55,7 +54,6 @@ prepareRuntime buildDir o = do
TargetAsm -> return ()
TargetReg -> return ()
TargetTree -> return ()
TargetNockma -> return ()
TargetAnoma -> return ()
TargetCasm -> return ()
where
Expand Down Expand Up @@ -119,8 +117,6 @@ outputFile opts inputFile =
replaceExtension' juvixRegFileExt baseOutputFile
TargetTree ->
replaceExtension' juvixTreeFileExt baseOutputFile
TargetNockma ->
replaceExtension' nockmaFileExt baseOutputFile
TargetAnoma ->
replaceExtension' nockmaFileExt baseOutputFile
TargetCasm ->
Expand Down
2 changes: 0 additions & 2 deletions app/Commands/Extra/Compile/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ data CompileTarget
| TargetAsm
| TargetReg
| TargetTree
| TargetNockma
| TargetAnoma
| TargetCasm
deriving stock (Eq, Data, Bounded, Enum)
Expand All @@ -28,7 +27,6 @@ instance Show CompileTarget where
TargetAsm -> "asm"
TargetReg -> "reg"
TargetTree -> "tree"
TargetNockma -> "nockma"
TargetAnoma -> "anoma"
TargetCasm -> "casm"

Expand Down
3 changes: 0 additions & 3 deletions src/Juvix/Compiler/Backend.hs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ data Target
| TargetAsm
| TargetReg
| TargetTree
| TargetNockma
| TargetAnoma
| TargetCairo
deriving stock (Data, Eq, Show)
Expand Down Expand Up @@ -94,8 +93,6 @@ getLimits tgt debug = case tgt of
}
TargetTree ->
defaultLimits
TargetNockma ->
defaultLimits
TargetAnoma ->
defaultLimits
TargetCairo ->
Expand Down
Loading
Loading