summaryrefslogtreecommitdiff
path: root/src
AgeCommit message (Collapse)Author
2018-04-13Check all patterns inside functions with -dsanityBrian Campbell
2018-04-12Fill in some minor missing cases in monomorphisationBrian Campbell
2018-04-11Avoid unnecessary rechecking in remove numeral pats rewriteBrian Campbell
(especially as the environment previously used was a bit dodgy)
2018-04-11Use more robust method of finding deps of new tyvars in mono analysisBrian Campbell
2018-04-11Make the atom to singleton type rewriter replace literals with guardsBrian Campbell
(previously the typechecker did this for all literal patterns, but now it's only necessary for the rewritten arguments)
2018-04-10Porting some minisail changes to sail2 branchAlasdair Armstrong
This commit primarily changes how existential types are bound in letbindings. Essentially, the constraints on both numeric and existentially quantified types are lifted into the surrounding type context automatically, so in ``` val f : nat -> nat let x = f(3) ``` whereas x would have had type nat by default before, it'll now have type atom('n) with a constraint that 'n >= 0 (where 'n is some fresh type variable). This has several advantages: x can be passed to functions expecting an atom argument, such as a vector indexing operation without any clunky cast functions - ex_int, ex_nat, and ex_range are no longer required. The let 'x = something() syntax is also less needed, and is now only really required when we specifically want a name to refer to x's type. This changes slightly the nature of the type pattern syntax---whereas previously it was used to cause an existential to be destructured, it now just provides names for an automatically destructured binding. Usually however, this just works the same. Also: - Fixed an issue where the rewrite_split_fun_constr_pats rewriting pass didn't add type paramemters for newly added type variables in generated function parameters. - Updated string_of_ functions in ast_util to reflect syntax changes - Fixed a C compilation issue where elements of union type constructors were not being coerced between big integers and 64-bit integers where appropriate - Type annotations in patterns now generalise, rather than restrict the type of the pattern. This should be safer and easier to handle in the various backends. I don't think any code we had was relying on this behaviour anyway. - Add inequality operator to lib/flow.sail - Fix an issue whereby top-level let bindings with annotations were checked incorrectly
2018-04-10Avoid rejecting reasonable pattern matches in monomorphisationBrian Campbell
(when they're not relevant)
2018-04-10Add basic reference support to monomorphisationBrian Campbell
2018-04-09Remove unnecessary restriction on complex nexp rewritingBrian Campbell
2018-04-09Stop vector_typ_args_of from failing when order is a variableBrian Campbell
Now it just returns the actual arguments and a separate function calculates the start index when required.
2018-04-06Fix some error msg typos.Prashanth Mundkur
2018-04-06Generate better tyvar names for complex nexps in monomorphisationBrian Campbell
2018-04-06Update sail.tex for wip latex outputAlasdair Armstrong
Fix a bug in initial check which caused X() = y to expect an additional parameter. Some tweaks to sail2 emacs mode
2018-04-05Fix precedence printing and update aarch64 specAlasdair Armstrong
More work on Latex output
2018-04-05More work on latex outputAlasdair Armstrong
Now generate commands for each toplevel definition, such that e.g. the function clause for execute LOAD could be inserted using \sailexecuteLOAD. Tries to generate fairly intuitive names while avoiding clashes where possible.
2018-04-05Cleanup repository by removing old and generated filesAlasdair Armstrong
Rename l2.ott to sail.ott
2018-04-05Add generic prelude library that pulls in various basic sailAlasdair Armstrong
definitions from sail/lib.
2018-04-04Make Type_check.solve do obvious cases immediatelyBrian Campbell
2018-04-04Use solver properly to simplify nexps in mono analysis, Lem printingBrian Campbell
Turn on complex nexp rewriting for mono by default (NB: solving is currently quite slow, will optimise)
2018-04-04Instantiate type properly when introducing mono castsBrian Campbell
(also reorder the phases a little)
2018-04-04Use valspec equations in monomorphisation analysisBrian Campbell
2018-04-04Tweak Type_check.solve for this branchBrian Campbell
2018-04-04Add a function to find unique solution for constraintsAlasdair Armstrong
New function Type_check.solve : Env.t -> nexp -> Big_int.num option. Takes an environment and an n-expression (nexp), and returns either Some u, where u is a unique solution such that nexp = u, or None which indicates that either no unique solution could be found. It is technically possible that a unique solution could exist, but Z3 may not find it. Involves two calls to Z3, one of which cannot be memoised, so should be used carefully, as over-reliance could lead to performance issues.
2018-04-04Add bitvector casts to funcl bodies when necessaryBrian Campbell
2018-04-04Initial rewrite to move complex nexps in fn sigs into constraintsBrian Campbell
(for monomorphisation, off for now because the analysis needs extended). Also tighten up orig_nexp, make Lem backend replace # in type variables.
2018-04-04Improve location information in mono dependency errorsBrian Campbell
2018-04-04Use simple equations in function specifications to instantiate tyvarsBrian Campbell
Allows the type checker to deal with val foo : forall 'm 'n, 'n = 8 * 'm. atom('m) -> bits('n) for example
2018-04-03Fix failing ARM testAlasdair Armstrong
2018-04-03Added test cases for builtinsAlasdair Armstrong
Added library for simple integer arithmetic functions in lib/arith.sail WIP TeX file for formatting latex output included in lib/sail.tex Fixes for bugs in sail_lib
2018-03-27print IPS after running cheri model.Robert Norton
2018-03-23Fix indentation of loops in generated IsabelleThomas Bauereiss
2018-03-22Fix C compilation for CHERI and MIPSAlasdair Armstrong
First, the specialisation of option types has been fixed by allowing the specialisation of constructor return types - this essentially means that a constructor, such as Some : 'a -> option('a) can get specialised to int -> option(int), rather than int -> option('a). This means that these constructors are treated like GADTs internally. Since this only happens just before the C translation, I haven't put much effort into making this very robust so far. Second, there was a bug in C compilation for the typing of return expressions in non-unit contexts, which has been fixed. Finally support for vector literals that are non-bitvectors has been added.
2018-03-22Try removing superfluous returns more aggressively for LemThomas Bauereiss
2018-03-22Tune Lem pretty-printingThomas Bauereiss
In particular, improve indentation of if-expressions, and provide infix syntax for monadic binds in Isabelle, allowing Lem to preserve source whitespace.
2018-03-19Fixes to C backend for RISCV-compilationAlasdair Armstrong
Can now compile RISCV. Requires some library tweaks before it'll pass any tests, Also adds hyperlinks to wip latex output
2018-03-15Sail now exits with code 1 when OCaml fails to compile generated codeAlasdair Armstrong
Fixes #11
2018-03-15Some CHERI compilation fixesThomas Bauereiss
2018-03-14WIP Latex formattingAlasdair Armstrong
Added option -latex that outputs input to a latex document. Added doc comments that can be attached to certain AST nodes - right now just valspecs and function clauses, e.g. /*! Documentation for main */ val main : unit -> unit These comments are kept by the sail pretty printer, and used when generating latex
2018-03-14Fix toplevel pattern compilationAlasdair Armstrong
Comment out partially working optimisation passes for now
2018-03-14Machine words extract/update operations arguments are the other way aroundBrian Campbell
2018-03-14Remove unnecessary size_itself_int uses in guards (for Lem)Brian Campbell
Doesn't remove them from function bodies because that can produce more work for the sizeof rewriting.
2018-03-14Fix compilation for OCaml 4.02Thomas Bauereiss
find_opt is only available from OCaml 4.05
2018-03-14Fix Lem generation for CHERI-MIPS and Aarch64Thomas Bauereiss
- Update Lem bindings and extras files - Rewrite Nexp_var's if they are bound to a constant, similar to Nexp_id's (used for cap_size in the CHERI spec) - Add Lem and Isabelle Makefile targets for CHERI
2018-03-14Make partiality more explicit in library functions of Lem shallow embeddingThomas Bauereiss
Some functions are partial, e.g. converting a bitvector to an integer, which might fail for the bit list representation due to undefined bits. Undefined cases can be handled in different ways: - call Lem's failwith, which maps to undefined/ARB in Isabelle and HOL (the default so far), - return an option type, - raise a failure in the monad, or - use a bitstream oracle to resolve undefined bits. This patch adds different versions of partial functions corresponding to those options. The desired behaviour can be selected by choosing a binding in the Sail prelude. The naming scheme is that the failwith version is the default, while the other versions have the suffixes _maybe, _fail, and _oracle, respectively.
2018-03-14Add rewriting step for moving execute clauses into auxiliary functionsThomas Bauereiss
For example, generates an auxiliary function execute_ADD (rs, rt, rd) for the clause execute (ADD (rs,rt,rd)) = ... Without this rewriting, the execute function easily becomes too large to be handled by Isabelle (e.g., for CHERI-MIPS; for MIPS alone, it seems to be just about small enough). This used to be implemented in the pretty-printer, but that code was commented out recently in order to support a recursive execute function for RISC-V compressed instructions.
2018-03-14Disallow impure global let bindingsThomas Bauereiss
Effectful expressions are monadic in Lem, causing type errors when binding them to global immutable variables.
2018-03-14Add address to Write_tag outcomeThomas Bauereiss
The state monad currently assumes that tags are written to and read from properly aligned addresses (since it does not know the capability size used in the Sail model). This change allows the Sail model to pass in the aligned address(es) even if data is written to an unaligned address. There might be better ways to model tag writing, but this approach seems rather general.
2018-03-14Use sets instead of lists for Lem nondeterminism monadThomas Bauereiss
This simplifies reasoning in Isabelle.
2018-03-14fix riscv build: missing eq_bit implementation.Robert Norton
2018-03-13Polymorphic option types now compile to CAlasdair Armstrong
Fixed an issue whereby an option constructor that was never constructed, but only matched on, would cause compilation to fail. Temporarily fixed an issue where union types that can be entirely stack-allocated were not being treated as such, by simply heap-allocating all unions. Need to adapt the code generator to handle this case properly. Fixed a further small issue whereby multiple union types would confuse the type specialisation pass. Added a test case for compiling option types. RISCV now generates C code, but there are still some bugs that need to be squashed before it compile and work.