summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ast-to-instr/src/Expressions.java28
-rw-r--r--ast-to-instr/src/VHDLCSNode.java9
-rw-r--r--ast-to-instr/src/VHDLISNode.java9
-rw-r--r--ast-to-instr/src/VHDLSSASNode.java9
-rw-r--r--ast-to-instr/src/VHDLWNode.java9
-rw-r--r--data/level/control_flow_level.lvl4
-rw-r--r--data/level/structural_level.lvl27
-rw-r--r--instr-to-kodkod/Makefile3
-rw-r--r--instr-to-kodkod/parser/PropertyLexer.g42
-rw-r--r--instr-to-kodkod/parser/PropertyParser.g4195
-rw-r--r--instr-to-kodkod/src/VHDLLevel.java14
-rw-r--r--instr-to-kodkod/src/VHDLModel.java52
-rw-r--r--instr-to-kodkod/src/VHDLPredicate.java14
13 files changed, 205 insertions, 170 deletions
diff --git a/ast-to-instr/src/Expressions.java b/ast-to-instr/src/Expressions.java
index 0ea741b..90b0fff 100644
--- a/ast-to-instr/src/Expressions.java
+++ b/ast-to-instr/src/Expressions.java
@@ -19,6 +19,7 @@ public class Expressions
private static final XPathExpression XPE_GET_INDEX_LIST;
private static final XPathExpression XPE_GET_NAMED_ENTITY;
private static final XPathExpression XPE_GET_PREFIX_NAMED_ENTITY;
+ private static final XPathExpression XPE_GET_PREFIX;
static
{
@@ -29,7 +30,7 @@ public class Expressions
XPE_GET_FUN_PARAMETERS =
XMLManager.compile_or_die
(
- "./parameter_association_chain/el"
+ "./parameter_association_chain/el/actual"
);
XPE_GET_INDEX_LIST = XMLManager.compile_or_die("./index_list/el");
@@ -40,6 +41,8 @@ public class Expressions
(
"./prefix/named_entity"
);
+
+ XPE_GET_PREFIX = XMLManager.compile_or_die("./prefix");
}
private static enum Operator
@@ -266,7 +269,7 @@ public class Expressions
final int params_length;
named_entity =
- (Node) XPE_GET_PREFIX_NAMED_ENTITY.evaluate
+ (Node) XPE_GET_PREFIX/*_NAMED_ENTITY*/.evaluate
(
current_node,
XPathConstants.NODE
@@ -274,18 +277,27 @@ public class Expressions
structure.append("(?");
+ /*
+ * TODO: Handle functions better, like:
+ elements.add
+ (
+ IDs.get_id_from_xml_id
+ (
+ XMLManager.get_attribute(named_entity, "ref"),
+ null
+ )
+ );
+ * But for now, we'll just use the function's name as string:
+ */
elements.add
(
- Waveforms.get_associated_waveform_id
+ Strings.get_id_from_string
(
- IDs.get_id_from_xml_id
- (
- XMLManager.get_attribute(named_entity, "ref"),
- null
- )
+ XMLManager.get_attribute(named_entity, "identifier")
)
);
+
params =
(NodeList) XPE_GET_FUN_PARAMETERS.evaluate
(
diff --git a/ast-to-instr/src/VHDLCSNode.java b/ast-to-instr/src/VHDLCSNode.java
index 3e991f0..f500345 100644
--- a/ast-to-instr/src/VHDLCSNode.java
+++ b/ast-to-instr/src/VHDLCSNode.java
@@ -75,7 +75,6 @@ public class VHDLCSNode extends VHDLNode
handle_function_label(local_id);
handle_function_kind(local_id);
handle_function_depth(local_id);
- handle_function_expression(local_id);
/** Predicates **********************************************************/
handle_predicate_has_option(local_id);
@@ -138,14 +137,6 @@ public class VHDLCSNode extends VHDLNode
);
}
- private void handle_function_expression
- (
- final IDs local_id
- )
- {
- /* TODO */
- }
-
/***************************************************************************/
/** Predicates *************************************************************/
/***************************************************************************/
diff --git a/ast-to-instr/src/VHDLISNode.java b/ast-to-instr/src/VHDLISNode.java
index 62fc3da..3c293cd 100644
--- a/ast-to-instr/src/VHDLISNode.java
+++ b/ast-to-instr/src/VHDLISNode.java
@@ -74,7 +74,6 @@ public class VHDLISNode extends VHDLNode
handle_function_label(local_id);
handle_function_kind(local_id);
handle_function_depth(local_id);
- handle_function_expression(local_id);
/** Predicates **********************************************************/
handle_predicate_has_option(local_id);
@@ -136,14 +135,6 @@ public class VHDLISNode extends VHDLNode
);
}
- private void handle_function_expression
- (
- final IDs local_id
- )
- {
- /* TODO */
- }
-
/***************************************************************************/
/** Predicates *************************************************************/
/***************************************************************************/
diff --git a/ast-to-instr/src/VHDLSSASNode.java b/ast-to-instr/src/VHDLSSASNode.java
index ef08f6f..b638f81 100644
--- a/ast-to-instr/src/VHDLSSASNode.java
+++ b/ast-to-instr/src/VHDLSSASNode.java
@@ -68,7 +68,6 @@ public class VHDLSSASNode extends VHDLNode
handle_function_label(local_id);
handle_function_kind(local_id);
handle_function_depth(local_id);
- handle_function_expression(local_id);
/** Predicates **********************************************************/
handle_predicate_has_option(local_id);
@@ -130,14 +129,6 @@ public class VHDLSSASNode extends VHDLNode
);
}
- private void handle_function_expression
- (
- final IDs local_id
- )
- {
- /* TODO */
- }
-
/***************************************************************************/
/** Predicates *************************************************************/
/***************************************************************************/
diff --git a/ast-to-instr/src/VHDLWNode.java b/ast-to-instr/src/VHDLWNode.java
index 84cebb9..4052229 100644
--- a/ast-to-instr/src/VHDLWNode.java
+++ b/ast-to-instr/src/VHDLWNode.java
@@ -67,7 +67,6 @@ public class VHDLWNode extends VHDLNode
handle_function_label(local_id);
handle_function_kind(local_id);
handle_function_depth(local_id);
- handle_function_expression(local_id);
/** Predicates **********************************************************/
handle_predicate_has_option(local_id);
@@ -125,14 +124,6 @@ public class VHDLWNode extends VHDLNode
);
}
- private void handle_function_expression
- (
- final IDs local_id
- )
- {
- /* TODO */
- }
-
/***************************************************************************/
/** Predicates *************************************************************/
/***************************************************************************/
diff --git a/data/level/control_flow_level.lvl b/data/level/control_flow_level.lvl
index 9408409..3b11efe 100644
--- a/data/level/control_flow_level.lvl
+++ b/data/level/control_flow_level.lvl
@@ -28,3 +28,7 @@
(add_predicate is_read_element node string waveform)
(add_predicate is_read_element node string string)
(add_predicate is_terminal node)
+
+(add_function label node string)
+(add_function kind node string)
+(add_function depth node string)
diff --git a/data/level/structural_level.lvl b/data/level/structural_level.lvl
index 193eca4..40aa455 100644
--- a/data/level/structural_level.lvl
+++ b/data/level/structural_level.lvl
@@ -30,6 +30,9 @@
(add_predicate end_has_reserved_id entity)
(add_predicate end_has_identifier entity)
(add_predicate is_simulation_scenario entity)
+(add_function line entity string)
+(add_function column entity string)
+(add_function identifier entity string)
;;;; Port ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add_predicate is_port_of port entity)
@@ -45,6 +48,9 @@
(add_predicate has_open_flag port)
(add_predicate has_guarded_signal_flag port)
(add_predicate is_of_kind port string)
+(add_function line port string)
+(add_function column port string)
+(add_function identifier port string)
;;;; Generic ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add_predicate is_generic_of generic entity)
@@ -54,8 +60,11 @@
(add_predicate has_visible_flag generic)
(add_predicate has_after_drivers_flag generic)
(add_predicate is_of_type generic type)
+(add_function line generic string)
+(add_function column generic string)
+(add_function identifier generic string)
-;;;; File ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;; Architecture ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add_predicate is_in_file architecture file)
(add_predicate is_architecture_of architecture entity)
(add_predicate has_foreign_flag architecture)
@@ -63,6 +72,9 @@
(add_predicate is_within_flag architecture)
(add_predicate end_has_reserved_id architecture)
(add_predicate end_has_identifier architecture)
+(add_function line architecture string)
+(add_function column architecture string)
+(add_function identifier architecture string)
;;;; Signal ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add_predicate belongs_to_architecture signal architecture)
@@ -77,6 +89,9 @@
(add_predicate has_guarded_flag signal)
(add_predicate is_of_kind signal string)
(add_predicate is_of_type signal type)
+(add_function line signal string)
+(add_function column signal string)
+(add_function identifier signal string)
;;;; Process ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add_predicate belongs_to_architecture process architecture)
@@ -92,17 +107,27 @@
(add_predicate end_has_reserved_id process)
(add_predicate end_has_identifier process)
(add_predicate is_explicit_process process)
+(add_function line process string)
+(add_function column process string)
+(add_function label process string)
+
+;;;; File ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(add_function filename file string)
;;;; Component ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add_predicate is_component_of component entity)
(add_predicate belongs_to_architecture component architecture)
(add_predicate port_maps component waveform port)
+(add_function line component string)
+(add_function column component string)
+(add_function label component string)
;;;; Waveform ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add_predicate is_in_sensitivity_list waveform process)
(add_predicate is_accessed_by waveform process)
(add_predicate is_waveform_of waveform signal)
(add_predicate is_waveform_of waveform port)
+(add_predicate is_waveform_of waveform generic)
;;;; String ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add_predicate string_matches string string)
diff --git a/instr-to-kodkod/Makefile b/instr-to-kodkod/Makefile
index bb52959..1b59ccd 100644
--- a/instr-to-kodkod/Makefile
+++ b/instr-to-kodkod/Makefile
@@ -5,8 +5,9 @@ MAP_FILES = $(wildcard ../ast-to-instr/*.map)
LEVEL_DIR = $(wildcard ../data/level/*.lvl)
#PROPERTY_FILE = ../data/property/unread_waveforms.pro
#PROPERTY_FILE = ../data/property/impossible_processes.pro
-PROPERTY_FILE = ../data/property/incrementer.pro
+#PROPERTY_FILE = ../data/property/incrementer.pro
#PROPERTY_FILE = ../data/property/combinational_processes.pro
+PROPERTY_FILE = ../data/property/likely_a_clock.pro
VAR_PREFIX = "_anon_"
## Executables #################################################################
diff --git a/instr-to-kodkod/parser/PropertyLexer.g4 b/instr-to-kodkod/parser/PropertyLexer.g4
index 46aa30f..9fcad29 100644
--- a/instr-to-kodkod/parser/PropertyLexer.g4
+++ b/instr-to-kodkod/parser/PropertyLexer.g4
@@ -4,6 +4,8 @@ fragment SEP: [ \t\r\n]+;
L_PAREN : '(';
R_PAREN : ')';
+L_BRAKT: ']';
+R_BRAKT: '[';
TAG_EXISTING_KW: '(tag_existing' SEP;
diff --git a/instr-to-kodkod/parser/PropertyParser.g4 b/instr-to-kodkod/parser/PropertyParser.g4
index 82eb429..29e91d2 100644
--- a/instr-to-kodkod/parser/PropertyParser.g4
+++ b/instr-to-kodkod/parser/PropertyParser.g4
@@ -116,7 +116,7 @@ tag_item
}
;
-id_or_string
+id_or_string_or_fun [Variable current_node]
returns [Expression value]
:
@@ -138,9 +138,15 @@ id_or_string
$value = Main.get_string_manager().get_string_as_relation(($STRING.text));
System.out.println("Using (STR \"" + ($STRING.text) + "\" " + ($value) + ")");
}
+
+ |
+ function[current_node]
+ {
+ $value = ($function.result);
+ }
;
-id_list
+id_list [Variable current_node]
returns [List<Expression> list, boolean has_joker]
@init
@@ -152,14 +158,14 @@ id_list
:
(
(WS)+
- id_or_string
+ id_or_string_or_fun[current_node]
{
- if (($id_or_string.value) == (Expression) null)
+ if (($id_or_string_or_fun.value) == (Expression) null)
{
used_joker = true;
}
- result.add(($id_or_string.value));
+ result.add(($id_or_string_or_fun.value));
}
)*
@@ -169,16 +175,12 @@ id_list
}
;
-/******************************************************************************/
-/** Structural Level **********************************************************/
-/******************************************************************************/
-
-sl_predicate
+predicate [Variable current_node]
returns [Formula result]:
(WS)* L_PAREN
ID
- id_list
+ id_list[current_node]
(WS)* R_PAREN
{
@@ -198,7 +200,7 @@ sl_predicate
(
"[F] The property uses an unknown predicate: \""
+ ($ID.text)
- + "\" at structural level. (l."
+ + "\" (l."
+ ($ID.getLine())
+ " c."
+ ($ID.getCharPositionInLine())
@@ -212,17 +214,30 @@ sl_predicate
{
final List<IntExpression> columns;
final int params_length;
+ final int offset;
ids = new ArrayList<Expression>();
columns = new ArrayList<IntExpression>();
params_length = ($id_list.list).size();
+ if (current_node == null)
+ {
+ offset = 0;
+ }
+ else
+ {
+ offset = 1;
+
+ ids.add(current_node);
+ columns.add(IntConstant.constant(0));
+ }
+
for (int i = 0; i < params_length; ++i)
{
if (($id_list.list).get(i) != (Expression) null)
{
- columns.add(IntConstant.constant(i));
+ columns.add(IntConstant.constant(i + offset));
ids.add(($id_list.list).get(i));
}
}
@@ -237,12 +252,85 @@ sl_predicate
{
predicate = predicate_as_relation;
ids = ($id_list.list);
+
+ if (current_node != null)
+ {
+ ids.add(0, current_node);
+ }
}
$result = Expression.product(ids).in(predicate);
}
;
+function [Variable current_node]
+ returns [Expression result]:
+
+ (WS)* L_BRAKT
+ ID
+ id_list[current_node]
+ (WS)* R_BRAKT
+
+ {
+ final Expression predicate;
+ final List<Expression> ids;
+ final Relation predicate_as_relation;
+
+ predicate_as_relation =
+ Main.get_model().get_predicate_as_relation
+ (
+ ($ID.text)
+ );
+
+ if (predicate_as_relation == (Relation) null)
+ {
+ System.err.println
+ (
+ "[F] The property uses an unknown predicate: \""
+ + ($ID.text)
+ + "\" (l."
+ + ($ID.getLine())
+ + " c."
+ + ($ID.getCharPositionInLine())
+ + ")."
+ );
+
+ System.exit(-1);
+ }
+
+ if (($id_list.has_joker))
+ {
+ System.err.println
+ (
+ "[F] The property uses a joker inside a function: \""
+ + ($ID.text)
+ + "\" (l."
+ + ($ID.getLine())
+ + " c."
+ + ($ID.getCharPositionInLine())
+ + ")."
+ );
+
+ System.exit(-1);
+ }
+ else
+ {
+ predicate = predicate_as_relation;
+ ids = ($id_list.list);
+
+ if (current_node != null)
+ {
+ ids.add(0, current_node);
+ }
+
+ $result = Expression.product(ids).join(predicate);
+ }
+ }
+;
+
+/******************************************************************************/
+/** Structural Level **********************************************************/
+/******************************************************************************/
sl_non_empty_formula_list
returns [List<Formula> list]
@@ -466,9 +554,9 @@ sl_ctl_verifies_operator
sl_formula
returns [Formula result]:
- sl_predicate
+ predicate[null]
{
- $result = ($sl_predicate.result);
+ $result = ($predicate.result);
}
| sl_and_operator
@@ -510,79 +598,6 @@ sl_formula
/******************************************************************************/
/** Behavioral Level **********************************************************/
/******************************************************************************/
-bl_predicate [Variable current_node]
- returns [Formula result]:
-
- (WS)* L_PAREN
- ID
- id_list
- (WS)* R_PAREN
-
- {
- final Expression predicate;
- final List<Expression> ids;
- final Relation predicate_as_relation;
-
- predicate_as_relation =
- Main.get_model().get_predicate_as_relation
- (
- ($ID.text)
- );
-
- if (predicate_as_relation == (Relation) null)
- {
- System.err.println
- (
- "[F] The property uses an unknown predicate: \""
- + ($ID.text)
- + "\" at behavioral level (l."
- + ($ID.getLine())
- + " c."
- + ($ID.getCharPositionInLine())
- + ")."
- );
-
- System.exit(-1);
- }
-
- if (($id_list.has_joker))
- {
- final List<IntExpression> columns;
- final int params_length;
-
- ids = new ArrayList<Expression>();
- columns = new ArrayList<IntExpression>();
-
- params_length = ($id_list.list).size();
-
- /* We always keep the node id. */
- columns.add(IntConstant.constant(0));
-
- for (int i = 0; i < params_length; ++i)
- {
- if (($id_list.list).get(i) != (Expression) null)
- {
- columns.add(IntConstant.constant(i + 1)); // Offset for the node
- ids.add(($id_list.list).get(i));
- }
- }
-
- predicate =
- predicate_as_relation.project
- (
- columns.toArray(new IntExpression[columns.size()])
- );
- }
- else
- {
- predicate = predicate_as_relation;
- ids = ($id_list.list);
- }
-
- $result = current_node.product(Expression.product(ids)).in(predicate);
- }
-;
-
bl_formula_list [Variable current_node]
returns [List<Formula> list]
@@ -1017,9 +1032,9 @@ bl_eu_operator [Variable current_node]
bl_formula [Variable current_node]
returns [Formula result]:
- bl_predicate[current_node]
+ predicate[current_node]
{
- $result = ($bl_predicate.result);
+ $result = ($predicate.result);
}
| bl_and_operator[current_node]
{
diff --git a/instr-to-kodkod/src/VHDLLevel.java b/instr-to-kodkod/src/VHDLLevel.java
index 738adaf..57bb8c4 100644
--- a/instr-to-kodkod/src/VHDLLevel.java
+++ b/instr-to-kodkod/src/VHDLLevel.java
@@ -60,7 +60,11 @@ public class VHDLLevel
}
else if (input[0].equals("add_predicate"))
{
- success = handle_add_predicate(input, m);
+ success = handle_add_predicate(input, m, false);
+ }
+ else if (input[0].equals("add_function"))
+ {
+ success = handle_add_predicate(input, m, true);
}
else
{
@@ -128,7 +132,8 @@ public class VHDLLevel
private static boolean handle_add_predicate
(
final String[] cmd,
- final VHDLModel m
+ final VHDLModel m,
+ final boolean is_function
)
{
final String[] signature;
@@ -137,7 +142,8 @@ public class VHDLLevel
{
System.err.println
(
- "[E] Badly formed \"add_predicate\" instruction: \""
+ "[E] Badly formed \"add_predicate\" or \"add_function\""
+ + " instruction: \""
+ String.join(" ", cmd)
+ "\"."
);
@@ -152,6 +158,6 @@ public class VHDLLevel
signature[i - 2] = cmd[i];
}
- return m.add_predicate(cmd[1], signature);
+ return m.add_predicate(cmd[1], signature, is_function);
}
}
diff --git a/instr-to-kodkod/src/VHDLModel.java b/instr-to-kodkod/src/VHDLModel.java
index ea024b8..4b6e053 100644
--- a/instr-to-kodkod/src/VHDLModel.java
+++ b/instr-to-kodkod/src/VHDLModel.java
@@ -25,7 +25,12 @@ public class VHDLModel
}
}
- public boolean add_predicate (final String name, final String[] signature)
+ public boolean add_predicate
+ (
+ final String name,
+ final String[] signature,
+ final boolean is_function
+ )
{
final VHDLPredicate p;
final VHDLType[] true_signature;
@@ -55,7 +60,11 @@ public class VHDLModel
if (p == null)
{
- predicates.put(name, new VHDLPredicate(name, true_signature));
+ predicates.put
+ (
+ name,
+ new VHDLPredicate(name, true_signature, false)
+ );
}
else
{
@@ -113,7 +122,15 @@ public class VHDLModel
}
else if (input[0].equals("set_function"))
{
- success = handle_set_function(input);
+ if (input.length < 2)
+ {
+ success = false;
+ }
+ success =
+ handle_predicate
+ (
+ Arrays.copyOfRange(input, 1, input.length)
+ );
}
else
{
@@ -126,7 +143,9 @@ public class VHDLModel
(
"[E] An erroneous instruction was found in file \""
+ filename
- + "\"."
+ + "\": \"("
+ + String.join(" ", input)
+ + ")\")"
);
try
@@ -186,30 +205,6 @@ public class VHDLModel
return true;
}
- private boolean handle_set_function (final String... cmd)
- {
- if (cmd.length != 4)
- {
- System.err.println
- (
- "[E] Badly formed \"set_function\" instruction: \""
- + String.join(" ", cmd)
- + "\"."
- );
-
- return false;
- }
-
- /*
- System.err.println
- (
- "[W] \"set_function\" instructions are ignored."
- );
- */
-
- return true;
- }
-
private boolean handle_predicate (final String... cmd)
{
final VHDLPredicate p;
@@ -256,7 +251,6 @@ public class VHDLModel
for (int i = 0; i < params.length; ++i)
{
- /* TODO: check if the IDs are registered in the corresponding type. */
params[i] = cmd[i + 1];
if (!p.accepts_as_nth_param(i, params[i]))
diff --git a/instr-to-kodkod/src/VHDLPredicate.java b/instr-to-kodkod/src/VHDLPredicate.java
index 3605e76..0ff388b 100644
--- a/instr-to-kodkod/src/VHDLPredicate.java
+++ b/instr-to-kodkod/src/VHDLPredicate.java
@@ -14,11 +14,18 @@ public class VHDLPredicate
private final String name;
private final int arity;
private final Relation as_relation;
+ private final boolean is_function;
private boolean is_used;
- public VHDLPredicate (final String name, final VHDLType[] signature)
+ public VHDLPredicate
+ (
+ final String name,
+ final VHDLType[] signature,
+ final boolean is_function
+ )
{
this.name = name;
+ this.is_function = is_function;
arity = signature.length;
signatures = new ArrayList<VHDLType[]>();
@@ -45,6 +52,11 @@ public class VHDLPredicate
return arity;
}
+ public boolean is_function ()
+ {
+ return is_function;
+ }
+
public Relation get_as_relation ()
{
if (!is_used)