Commit b11527ae authored by yoogx's avatar yoogx

Merge branch 'master' of https://github.com/OpenAADL/ocarina

parents 62eeff57 8d9b777a
This diff is collapsed.
......@@ -73,6 +73,28 @@ def instantiate (root_system):
return runOcarinaFunction (libocarina_python.instantiate, root_system)
################################################################################
def set_real_theorem (theorem_name):
'''Set main REAL theorem
:param theorem_name: name of the theorem
:type theorem_name: string
'''
return runOcarinaFunction (libocarina_python.set_real_theorem, theorem_name)
################################################################################
def add_real_library (libraryname):
'''
:param libraryname: name of the theorem
:type libraryname: string
'''
return runOcarinaFunction (libocarina_python.add_real_library, libraryname)
################################################################################
Backends = Enum ([ "polyorb_hi_ada", "polyorb_hi_c", "real_theorem"])
'''List of supported backends, used by :data:`generate`'''
......
......@@ -9,7 +9,7 @@ def printError(source, messages):
for message in messages:
print message
def main(argv):ne
def main(argv):
'''Test function'''
import ocarina;
import lmp;
......
#! /usr/bin/python
import OcarinaPython as ocarina;
def visitor (component,level) :
subcomponents=ocarina.AIN.Subcomponents(component);
if subcomponents is not None :
prefix=''
while ( len(prefix)<level ) :
prefix=prefix+'.'
for child in subcomponents :
print prefix,ocarina.getInstanceName(child)[0]
visitor(str(ocarina.AIN.Corresponding_Instance(child)),level+1)
import ocarina
import lmp
def main ():
'''Test function'''
err=ocarina.load("rma.aadl"); # load a file
print 'load("rma.aadl")'
if err[1].strip()!='':
print 'info message: \n', err[1]
print err
if err[1] != None:
print 'info message: ', err[1]
if err[2]!=[]:
print 'warning message: \n', err[2]
print 'warning message: ', err[2]
if err[3]!=[]:
print 'error message: \n', err[3]
print 'error message: ', err[3]
sys.exit(2)
err=ocarina.load("deployment.aadl"); # load a file
print 'load("deployment.aadl")'
if err[1].strip()!='':
print 'info message: \n', err[1]
if err[1] != None:
print 'info message: ', err[1]
if err[2]!=[]:
print 'warning message: \n', err[2]
print 'warning message: ', err[2]
if err[3]!=[]:
print 'error message: \n', err[3]
print 'error message: ', err[3]
sys.exit(2)
err=ocarina.analyze(); # analyze models
print 'ocarina.analyze()'
if err[1].strip()!='':
print 'info message: \n', err[1]
if err[1] != None:
print 'info message: ', err[1]
if err[2]!=[]:
print 'warning message: \n', err[2]
print 'warning message: ', err[2]
if err[3]!=[]:
print 'error message: \n', err[3]
print 'error message: ', err[3]
sys.exit(2)
err=ocarina.instantiate("rma.erc32"); # instantiate system
print 'ocarina.instantiate("rma.erc32")'
if err[1].strip()!='':
print 'info message: \n', err[1]
err=ocarina.instantiate("rma.impl"); # instantiate system
print 'ocarina.instantiate("rma.impl")'
if err[1] != None:
print 'info message: ', err[1]
if err[2]!=[]:
print 'warning message: \n', err[2]
print 'warning message: ', err[2]
if err[3]!=[]:
print 'error message: \n', err[3]
print 'error message: ', err[3]
sys.exit(2)
print '----------------------------------------------------'
print 'Number of Component Instances:'
print '----------------------------------------------------'
root=ocarina.getInstances('all')[0][0]
# root=ocarina.getRoot()
print ocarina.getInstanceName(root)[0]
visitor(root,1)
if __name__ == "__main__":
main ()
......
......@@ -32,6 +32,9 @@
with Ada.Numerics.Generic_Elementary_Functions;
with Ocarina.Namet;
with Ocarina.Output;
with GNAT.OS_Lib; use GNAT.OS_Lib;
with Ocarina.Options; use Ocarina.Options;
with Outfiles; use Outfiles;
with Errors; use Errors;
with Locations; use Locations;
......@@ -3199,6 +3202,8 @@ package body Ocarina.Backends.REAL is
It : Natural := First;
Node : Node_Id;
Success : Boolean;
Fd : File_Descriptor;
begin
Root_System := Instantiate_Model (AADL_Root);
Exit_On_Error (No (AADL_Root), "Cannot instantiate AADL models");
......@@ -3206,6 +3211,10 @@ package body Ocarina.Backends.REAL is
Success := Analyze (REAL_Language, Root_System);
Exit_On_Error (not Success, "Cannot analyze REAL specifications");
if Output_Filename /= No_Name then
Fd := Set_Output (Output_Filename);
end if;
-- Runtime
while It <= Last (To_Run_Theorem_List) loop
......@@ -3243,6 +3252,9 @@ package body Ocarina.Backends.REAL is
It := It + 1;
end loop;
Set_Standard_Output;
Release_Output (Fd);
end Generate;
----------
......
......@@ -148,7 +148,6 @@ package body Ocarina.Analyzer.REAL is
procedure Register_Library_Theorems (REAL_Library : Node_Id) is
pragma Assert (Kind (REAL_Library) = K_Root_Node);
package RNU renames Ocarina.ME_REAL.REAL_Tree.Nutils;
N : Node;
T : Node_Id;
......@@ -210,6 +209,11 @@ package body Ocarina.Analyzer.REAL is
end loop;
else
-- Otherwise, iterate over Library theorems and fetch the
-- corresponding theorem.
RNU.Node_List.Init (To_Run_Theorem_List); -- Reset list of theorems
for J in RNU.Node_List.First .. RNU.Node_List.Last (Library_Theorems)
loop
A := Library_Theorems.Table (J).Node;
......@@ -292,18 +296,18 @@ package body Ocarina.Analyzer.REAL is
-- For non-used library theorems, we still analyze them,
-- since they can be called directly through the API
-- for J in RNU.Node_List.First ..
-- RNU.Node_List.Last (Library_Theorems) loop
-- Node := Library_Theorems.Table (J).Node;
for J in RNU.Node_List.First ..
RNU.Node_List.Last (Library_Theorems) loop
Node := Library_Theorems.Table (J).Node;
-- RNU.REAL_Root := Node;
RNU.REAL_Root := Node;
-- if not Analyze_Sub_Theorem (RNU.REAL_Root) then
-- Display_Analyzer_Error
-- (Root, "could not proceed to theorem analysis");
-- return False;
-- end if;
-- end loop;
if not Analyze_Sub_Theorem (RNU.REAL_Root) then
Display_Analyzer_Error
(Root, "could not proceed to theorem analysis");
return False;
end if;
end loop;
return True;
end Analyze_Model;
......
......@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
-- Copyright (C) 2005-2009 Telecom ParisTech, 2010-2015 ESA & ISAE. --
-- Copyright (C) 2005-2009 Telecom ParisTech, 2010-2016 ESA & ISAE. --
-- --
-- Ocarina is free software; you can redistribute it and/or modify under --
-- terms of the GNU General Public License as published by the Free Soft- --
......@@ -29,11 +29,11 @@
-- --
------------------------------------------------------------------------------
with GNAT.OS_Lib; use GNAT.OS_Lib;
with GNAT.OS_Lib; use GNAT.OS_Lib;
with Ocarina.Namet; use Ocarina.Namet;
with Ocarina.Output; use Ocarina.Output;
with Ocarina.Options; use Ocarina.Options;
with Ocarina.Options; use Ocarina.Options;
with Outfiles; use Outfiles;
package body Ocarina.ME_AADL.Printers is
......@@ -42,13 +42,14 @@ package body Ocarina.ME_AADL.Printers is
---------------------
procedure Print_AADL_Tree (Node : Node_Id; W : W_Node_Spg) is
Fd : File_Descriptor;
begin
if Output_Filename /= No_Name then
Get_Name_String (Output_Filename);
Set_Output (Create_File (Name_Buffer (1 .. Name_Len), Binary));
Fd := Set_Output (Output_Filename);
end if;
W.all (Node);
Set_Standard_Output;
Release_Output (Fd);
end Print_AADL_Tree;
end Ocarina.ME_AADL.Printers;
......@@ -1916,6 +1916,32 @@ package body Ocarina.FE_REAL.Parser is
end if;
end Process;
-----------------------
-- Load_REAL_Library --
-----------------------
procedure Load_REAL_Library (File_Name : Name_Id) is
use Ocarina.Files;
use Ocarina.Namet;
Buffer : Location;
REAL_External_Lib : Node_Id;
begin
Buffer := Load_File (File_Name);
if Buffer = No_Location then
Display_And_Exit
("could not load file " &
Get_Name_String (File_Name));
end if;
REAL_External_Lib := Process (No_Node, Buffer);
if No (REAL_External_Lib) then
Display_And_Exit ("could not parse REAL specification");
end if;
Register_Library_Theorems (REAL_External_Lib);
end Load_REAL_Library;
----------
-- Init --
----------
......@@ -1934,26 +1960,7 @@ package body Ocarina.FE_REAL.Parser is
-- parse and register it.
for J in REAL_Libs.First .. REAL_Libs.Last loop
declare
use Ocarina.Files;
Buffer : Location;
REAL_External_Lib : Node_Id;
begin
Buffer := Load_File (REAL_Libs.Table (J));
if Buffer = No_Location then
Display_And_Exit
("could not load file " &
Get_Name_String (REAL_Libs.Table (J)));
end if;
REAL_External_Lib := Process (No_Node, Buffer);
if No (REAL_External_Lib) then
Display_And_Exit ("could not parse REAL specification");
end if;
Register_Library_Theorems (REAL_External_Lib);
end;
Load_REAL_Library (REAL_Libs.Table (J));
end loop;
end Init;
......
......@@ -48,6 +48,8 @@ package Ocarina.FE_REAL.Parser is
procedure Init;
-- Initialize the parser
procedure Load_REAL_Library (File_Name : Name_Id);
package REAL_Libs is new GNAT.Table (Name_Id, Nat, 1, 10, 10);
-- Table of REAL libraries to consider
......
......@@ -192,7 +192,7 @@ package body Ocarina.Cmd_Line is
begin
Set_Usage (Ocarina_Options, Usage => "[switches] <aadl_files>");
-- Note: the order of call to Define_Switch dictate the order
-- Note: the order of call to Define_Switch dictates the order
-- of information when calling GNAT.Command_Line.Display_Help.
-- --help flag, just so that it appears in the online help
......@@ -294,7 +294,7 @@ package body Ocarina.Cmd_Line is
-- -real_theorem flag
Define_Switch (Ocarina_Options, "-real_theorem:",
Help => "Name of the main theorem to evaluate");
Help => "Name of the main REAL theorem to evaluate");
-- -real_lib flag
Define_Switch (Ocarina_Options, "-real_lib:",
......
......@@ -193,6 +193,44 @@ package body Ocarina.Python_Cmd is
Set_Return_Value (Data, Result);
end On_Instantiate;
-------------------------
-- On_Set_REAL_Theorem --
-------------------------
procedure On_Set_REAL_Theorem
(Data : in out Callback_Data'Class; Command : String);
procedure On_Set_REAL_Theorem
(Data : in out Callback_Data'Class;
Command : String)
is
pragma Unreferenced (Command);
Result : constant Boolean :=
Ocarina.Utils.Set_REAL_Theorem (Nth_Arg (Data, 1, ""));
begin
Set_Return_Value (Data, Result);
end On_Set_REAL_Theorem;
-------------------------
-- On_Add_REAL_Library --
-------------------------
procedure On_Add_REAL_Library
(Data : in out Callback_Data'Class; Command : String);
procedure On_Add_REAL_Library
(Data : in out Callback_Data'Class;
Command : String)
is
pragma Unreferenced (Command);
Result : constant Boolean :=
Ocarina.Utils.Add_REAL_Library (Nth_Arg (Data, 1, ""));
begin
Set_Return_Value (Data, Result);
end On_Add_REAL_Library;
----------------------
-- On_Get_AADL_Root --
----------------------
......@@ -761,6 +799,16 @@ package body Ocarina.Python_Cmd is
(Repo, "instantiate", 1, 1,
Handler => On_Instantiate'Unrestricted_Access);
-- set_real_theorem() function
Register_Command
(Repo, "set_real_theorem", 1, 1,
Handler => On_Set_REAL_Theorem'Unrestricted_Access);
-- add_real_library() function
Register_Command
(Repo, "add_real_library", 1, 1,
Handler => On_Add_REAL_Library'Unrestricted_Access);
-- getRoot() function
Register_Command
(Repo, "getRoot", 0, 0,
......@@ -791,12 +839,15 @@ package body Ocarina.Python_Cmd is
(Repo, "getNodeId", 1, 1,
Handler => On_Get_Node_Id'Unrestricted_Access);
Repo := Ocarina.ME_AADL.AADL_Instances.Nodes.Python.
Register_Generated_Functions (Repo);
-- Register functions generated from AADL declarative and
-- instance trees
Repo := Ocarina.ME_AADL.AADL_Tree.Nodes.Python.
Register_Generated_Functions (Repo);
Repo := Ocarina.ME_AADL.AADL_Instances.Nodes.Python.
Register_Generated_Functions (Repo);
return Repo;
end Register_Scripts_And_Functions;
......
......@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
-- Copyright (C) 2013-2015 ESA & ISAE. --
-- Copyright (C) 2013-2016 ESA & ISAE. --
-- --
-- Ocarina is free software; you can redistribute it and/or modify under --
-- terms of the GNU General Public License as published by the Free Soft- --
......@@ -36,10 +36,12 @@ with Ocarina.Output; use Ocarina.Output;
with Utils; use Utils;
with Ocarina.Analyzer; use Ocarina.Analyzer;
with Ocarina.Analyzer.REAL; use Ocarina.Analyzer.REAL;
with Ocarina.Backends; use Ocarina.Backends;
with Ocarina.Configuration; use Ocarina.Configuration;
with Ocarina.FE_AADL; use Ocarina.FE_AADL;
with Ocarina.FE_AADL.Parser;
with Ocarina.FE_REAL.Parser; use Ocarina.FE_REAL.Parser;
with Ocarina.Instances; use Ocarina.Instances;
with Ocarina.Parser; use Ocarina.Parser;
with Ocarina.Options; use Ocarina.Options;
......@@ -136,6 +138,32 @@ package body Ocarina.Utils is
return Success;
end Analyze;
----------------------
-- Set_REAL_Theorem --
----------------------
function Set_REAL_Theorem (Theorem_Name : String) return Boolean is
begin
if Theorem_Name /= "" then
Main_Theorem := To_Lower (Get_String_Name (Theorem_Name));
end if;
return True;
end Set_REAL_Theorem;
----------------------
-- Add_REAL_Library --
----------------------
function Add_REAL_Library (Library_Name : String) return Boolean is
begin
if Library_Name /= "" then
Write_Line ("Adding: " & Library_Name);
Load_REAL_Library (Get_String_Name (Library_Name));
end if;
return True;
end Add_REAL_Library;
-----------------
-- Instantiate --
-----------------
......
......@@ -41,6 +41,8 @@ package Ocarina.Utils is
function Instantiate (Root_System : String) return Boolean;
procedure Generate (Backend_Name : String);
procedure Reset;
function Set_REAL_Theorem (Theorem_Name : String) return Boolean;
function Add_REAL_Library (Library_Name : String) return Boolean;
function Get_AADL_Root return Node_Id;
function Get_Node_Id_From_String (Name : String) return Node_Id;
......
-- This AADL model illustrates how to conduct schedulability analysis
-- using Cheddar, and then code generation of periodic tasks.
--
-- Two periodic tasks run in parrallel, without interaction. Tasks
-- parameters allows RMA analysis
--
-- $Id: rma.aadl 7042M 2010-03-30 07:55:51Z (local) $
package RMAAadl
public
with Deployment;
-----------------
-- Subprograms --
-----------------
subprogram Hello_Spg_1
subprogram Hello_Spg_1
properties
source_language => (Ada95);
source_name => "Hello.Hello_Spg_1";
......@@ -100,6 +88,7 @@ subcomponents
cpu_rm : processor cpurm.impl;
properties
Actual_Processor_Binding => (reference (cpu_rm)) applies to node_a;
end rma.ERC32;
end RMAAadl;
......@@ -5,24 +5,24 @@ from ocarina import *;
def main ():
'''Test function'''
for backends in Backends:
print(backends);
result = add_real_library("rma.real") # load a file
print "%r" % (result)
result = load("rma.aadl") # load a file
print "%r" % (result)
result = load("deployment.aadl") # load a file
print "%r" % (result)
result = analyze() # analyze models
print "Analysis result %r" % (result)
load("rma.aadl"); # load a file
load("deployment.aadl"); # load a file
result = analyze(); # analyze models
print "Analysis result %r" % (result);
instantiate("rma.erc32"); # instantiate
generate (Backends.polyorb_hi_ada);
result = set_real_theorem ("rma_prop_def")
result = generate (Backends.real_theorem)
print "REAL execution %r" % (result)
print ""
reset();
load("rma.aadl"); # load a file
load("deployment.aadl"); # load a file
analyze(); # analyze models
instantiate("rma.erc32"); # instantiate
generate (Backends.polyorb_hi_ada);
result = set_real_theorem ("rma_prop_def_2")
result = generate (Backends.real_theorem)
print "REAL execution %r" % (result)
if __name__ == "__main__":
main ()
sys.exit (0); # exit
sys.exit (0) # exit
......@@ -5,6 +5,7 @@ test_real_exec_env_01.aadl:16:03: Warning: The value of source_language has been
lib.real:12:17: warning: Unable to determine actualy returned type.
lib.real:19:24: warning: Unable to determine actualy returned type.
lib.real:33:03: warning: Returned integer value will be cast to a float at runtime
lib.real:38:01 Backends: warning : Empty range set, returned value is 0.0
test_env_subtheorem_call_no_parameter execution
-------------------------------------
Evaluating theorem test_env_subtheorem_call_no_parameter
......@@ -82,7 +83,6 @@ Evaluating theorem test_env_subtheorem_call_with_empty_domain
* Iterate for variable: rma.erc32_node_a
Content of set a_set (test_real_exec_env_01.aadl:133:12) is
Evaluating x
lib.real:38:01 Backends: warning : Empty range set, returned value is 0.0
value for x after evaluating sub_theorem_6 is 0.00000E+00
=> Result: TRUE
......
......@@ -2,6 +2,8 @@ test_real_exec_05.aadl:10:03: Warning: source_language is not a list while the c
test_real_exec_05.aadl:10:03: Warning: The value of source_language has been converted into a list.
test_real_exec_05.aadl:16:03: Warning: source_language is not a list while the corresponding property name at programming_properties.aadl:61:02 is a list.
test_real_exec_05.aadl:16:03: Warning: The value of source_language has been converted into a list.
test_real_exec_05.aadl:147:12 Backends: error : Property is false for instance 84 (rma.erc32_cpu_rm)
test_real_exec_05.aadl:170:12 Backends: error : Property is false for instance 84 (rma.erc32_cpu_rm)
variables_basis execution
-------------------------------------
Evaluating theorem variables_basis
......@@ -60,7 +62,6 @@ Content of set threads (test_real_exec_05.aadl:141:14) is
rma.erc32_node_a_task1: 20 component instance test_real_exec_05.aadl:27:01
rma.erc32_node_a_task2: 52 component instance test_real_exec_05.aadl:40:01
-> value for y is 6000000000.0
test_real_exec_05.aadl:147:12 Backends: error : Property is false for instance 84 (rma.erc32_cpu_rm)
=> Result: FALSE
theorem variables_iterative_expressions is: FALSE
......@@ -77,7 +78,6 @@ Content of set threads (test_real_exec_05.aadl:158:14) is
rma.erc32_node_a_task1: 20 component instance test_real_exec_05.aadl:27:01
rma.erc32_node_a_task2: 52 component instance test_real_exec_05.aadl:40:01
-> value for y is 7000000000.0
test_real_exec_05.aadl:170:12 Backends: error : Property is false for instance 84 (rma.erc32_cpu_rm)
=> Result: FALSE
theorem variables_imbricated_iterative_expressions is: FALSE
......
theorems.real:3:09 Backends: error : Property is false for instance 6 (a.impl)
test.aadl:9:02 Backends: error : requirements are not fulfilled for theorem test_theorem
test_theorem execution
Processing requirement : required_theorem
-------------------------------------
Evaluating theorem required_theorem
* Iterate for variable: a.impl
theorems.real:3:09 Backends: error : Property is false for instance 6 (a.impl)
=> Result: FALSE
theorem required_theorem is: FALSE
test.aadl:9:02 Backends: error : requirements are not fulfilled for theorem test_theorem
theorem test_theorem is: FALSE
......
theorems.real:9:10 Backends: error : Property is false for instance 6 (a.impl)
theorems.real:1:01 Backends: error : requirements of sub1 are not fulfilled
test.aadl:8:05 Backends: error : requirements are not fulfilled for theorem test
test execution
Processing requirement : sub1
Processing requirement : sub2
......@@ -5,12 +8,10 @@ Processing requirement : sub2
Evaluating theorem sub2
* Iterate for variable: a.impl
theorems.real:9:10 Backends: error : Property is false for instance 6 (a.impl)
=> Result: FALSE
theorem sub2 is: FALSE
theorems.real:1:01 Backends: error : requirements of sub1 are not fulfilled
-------------------------------------
Evaluating theorem sub1
......@@ -19,7 +20,6 @@ Evaluating theorem sub1
theorem sub1 is: FALSE
test.aadl:8:05 Backends: error : requirements are not fulfilled for theorem test
theorem test is: FALSE
test.real:9:09 Backends: error : Property is false for instance 6 (a.impl)
test.real:1:01 Backends: error : requirements of sub1 are not fulfilled
test.aadl:26:09 Backends: error : requirements are not fulfilled for theorem test
test execution
Processing requirement : sub1
Processing requirement : sub2
......@@ -5,7 +8,6 @@ Processing requirement : sub2
Evaluating theorem sub2
* Iterate for variable: a.impl
test.real:9:09 Backends: error : Property is false for instance 6 (a.impl)
=> Result: FALSE
theorem sub2 is: FALSE
......@@ -25,7 +27,6 @@ Evaluating theorem sub3
theorem sub3 is: TRUE
test.real:1:01 Backends: error : requirements of sub1 are not fulfilled
-------------------------------------
Evaluating theorem sub1
......@@ -40,7 +41,6 @@ Evaluating theorem sub1
theorem sub1 is: FALSE
test.aadl:26:09 Backends: error : requirements are not fulfilled for theorem test
theorem test is: FALSE
......@@ -2,6 +2,8 @@ validation.aadl:13:03: Warning: source_language is not a list while the correspo
validation.aadl:13:03: Warning: The value of source_language has been converted into a list.
validation.aadl:20:03: Warning: source_language is not a list while the corresponding property name at programming_properties.aadl:61:02 is a list.
validation.aadl:20:03: Warning: The value of source_language has been converted into a list.
validation.aadl:135:99 Backends: error : Property is false for instance 122 (mysystem.local_ram)
validation.aadl:151:16 Backends: error : Property is false for instance 13 (mysystem.local_node)
contains_memories execution
-------------------------------------
Evaluating theorem contains_memories
......@@ -21,7 +23,6 @@ Evaluating theorem check_memory_and_process_mem
* Iterate for variable: mysystem.local_ram
Content of set prs (validation.aadl:133:28) is
mysystem.local_node: 13 component instance validation.aadl:87:01
validation.aadl:135:99 Backends: error : Property is false for instance 122 (mysystem.local_ram)
=> Result: FALSE
theorem check_memory_and_process_mem is: FALSE
......@@ -35,7 +36,6 @@ Evaluating theorem check_thread_and_process_mem
Content of set thrs (validation.aadl:144:28) is
mysystem.local_node_p1: 20 component instance validation.aadl:32:01
mysystem.local_node_p2: 60 component instance validation.aadl:51:01
validation.aadl:151:16 Backends: error : Property is false for instance 13 (mysystem.local_node)
=> Result: FALSE
theorem check_thread_and_process_mem is: FALSE
......
......@@ -17,11 +17,12 @@ Usage: ocarina [switches] <aadl_files>
-i Instantiate the model
-x Parse AADL file as an AADL scenario file
-g ARG Generate code using Ocarina backend 'ARG'
--list-backends List available backends
-b Compile generated code
-z Clean code generated
-k ARG Set POK flavor (arinc653/deos/pok/vxworks)
-t Run Ocarina in terminal interactive mode
-real_theorem ARG Name of the main theorem to evaluate
-real_theorem ARG Name of the main REAL theorem to evaluate
-real_lib ARG Add external library of REAL theorems
-real_continue_eval Continue evaluation of REAL theorems after first failure (REAL backend)
-boundt_process ARG Generate .tpo file for process ARG (Bound-T backend)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment