/
BParallelStatement.java
121 lines (101 loc) · 3.4 KB
/
BParallelStatement.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import java.util.Vector;
/* Package: B AMN */
/******************************
* Copyright (c) 2003,2019 Kevin Lano
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
* *****************************/
public class BParallelStatement extends BStatement
{ private Vector statements = new Vector(); // BStatement
private boolean isParallel = true;
public BParallelStatement() { }
public BParallelStatement(Vector sts)
{ statements = sts; }
public BParallelStatement(boolean par)
{ isParallel = par; }
public BParallelStatement(boolean par, Vector sts)
{ isParallel = par; statements = sts; }
public void addStatement(BStatement st)
{ statements.add(st); }
public void addStatements(Vector sts)
{ for (int i = 0; i < sts.size(); i++)
{ BStatement st = (BStatement) sts.get(i);
statements.add(st);
}
}
public Vector getStatements()
{ return statements; }
public String toString()
{ String res = "";
String op = "||";
if (isParallel == false)
{ op = ";"; }
int n = statements.size();
if (n == 0) { return " skip\n"; }
for (int i = 0; i < n-1; i++)
{ res = res + statements.get(i) + " " + op + "\n "; }
res = res + statements.get(n-1);
return res;
}
public BStatement substituteEq(String oldE, BExpression newE)
{ Vector nstats = new Vector();
for (int i = 0; i < statements.size(); i++)
{ BStatement stat = (BStatement) statements.get(i);
BStatement nstat = stat.substituteEq(oldE,newE);
nstats.add(nstat);
}
return new BParallelStatement(isParallel, nstats);
}
public BStatement simplify()
{ Vector nstats = new Vector();
for (int i = 0; i < statements.size(); i++)
{ BStatement stat = (BStatement) statements.get(i);
BStatement nstat = stat.simplify();
nstats.add(nstat);
}
return new BParallelStatement(isParallel, nstats);
}
public Vector wr()
{ Vector res = new Vector();
for (int i = 0; i < statements.size(); i++)
{ BStatement stat = (BStatement) statements.get(i);
res = VectorUtil.union(res,stat.wr());
}
return res;
}
public Vector rd()
{ Vector res = new Vector();
for (int i = 0; i < statements.size(); i++)
{ BStatement stat = (BStatement) statements.get(i);
res = VectorUtil.union(res,stat.rd());
}
return res;
}
public BStatement normalise()
{ BParallelStatement res = new BParallelStatement();
for (int i = 0; i < statements.size(); i++)
{ BStatement stat = (BStatement) statements.get(i);
res.addStatement(stat.normalise());
}
return res;
}
public BStatement seq2parallel()
{ BParallelStatement res = new BParallelStatement();
if (statements.size() < 2)
{ res.statements.addAll(statements);
return res;
}
BStatement s1 = (BStatement) statements.get(0);
Vector rem = new Vector();
Vector wr1 = s1.wr();
for (int i = 1; i < statements.size(); i++)
{ rem.add(statements.get(i)); }
BParallelStatement s2 = new BParallelStatement(rem);
Vector wr2 = s2.wr();
Vector rd2 = s2.rd();
return s1.sequence2parallel(s1,s2,wr1,wr2,rd2);
}
}