Skip to content

Commit 24d54f3

Browse files
committed
Implement Sieve.lf
1 parent a2efd88 commit 24d54f3

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

TS/src/Sieve.lf

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/**
2+
* Copyright (C) 2022 Hanyang University
3+
*
4+
* refer to https://github.com/lf-lang/reactor-ts/blob/master/src/benchmark/Sieve.ts
5+
*
6+
* @author Wonseo Choi
7+
*/
8+
9+
10+
target TypeScript {
11+
fast: true
12+
#logging: DEBUG
13+
};
14+
15+
import BenchmarkRunner from "BenchmarkRunner.lf";
16+
17+
18+
reactor Ramp(totalNumber:number(100000), period:time(1 nsec)) {
19+
input start: boolean;
20+
output value: number;
21+
output end: boolean;
22+
23+
logical action next(period): number;
24+
25+
reaction (start) -> next {=
26+
actions.next.schedule(0, 2);
27+
=}
28+
29+
reaction (next) -> next, value, end {=
30+
const n: number = next as number;
31+
32+
if (n <= totalNumber) {
33+
actions.next.schedule(0, n+1);
34+
value = n;
35+
} else{
36+
end = true;
37+
}
38+
39+
=}
40+
41+
}
42+
43+
reactor Filter(primeStart: number(2), primeNumber: number(1000)) {
44+
45+
input inp: number;
46+
output out: number;
47+
48+
state localPrimes: {=Array<number>=}({= [] =});
49+
state hasChild: boolean(false);
50+
51+
mutation (inp) -> out {=
52+
let div = false;
53+
const size = localPrimes.length;
54+
const p = inp as number;
55+
56+
for (const q of localPrimes) {
57+
if (Number.isInteger(p / q)) {
58+
div = true;
59+
break
60+
}
61+
}
62+
63+
if (!div) {
64+
if (size < primeNumber) {
65+
localPrimes.push(p);
66+
// Print finded prime number if want
67+
// console.log("New prime number : " + p);
68+
} else {
69+
// Potential prime found.
70+
if (!hasChild) {
71+
let n = new Filter(this.getReactor(), p, primeNumber);
72+
//this.start(n)
73+
// console.log("CREATING...")
74+
// let x = this.create(Filter, [this.getReactor(), p])
75+
// console.log("CREATED: " + x._getFullyQualifiedName())
76+
// util.getPort(out) -> __out.getPort()
77+
var port = __out.getPort();
78+
this.connect(port, n.inp);
79+
// FIXME: this updates the dependency graph, but it doesn't redo the topological sort
80+
// For a pipeline like this one, it is not necessary, but in general it is.
81+
// Can we avoid redoing the entire sort?
82+
hasChild = true;
83+
} else {
84+
out = p;
85+
}
86+
}
87+
}
88+
=}
89+
}
90+
91+
92+
main reactor Sieve(numIterations:number(12), totalNumber:number(100), primeStart: number(2), primeNumber: number(10), period: time(1 nsec)) {
93+
runner = new BenchmarkRunner(num_iterations=numIterations);
94+
source = new Ramp(totalNumber=totalNumber, period=period);
95+
filter = new Filter(primeStart=primeStart, primeNumber=primeNumber);
96+
97+
reaction (startup) {=
98+
console.log("Start Sieve of Eratosthenes LF Benchmark!");
99+
=}
100+
101+
runner.start -> source.start;
102+
source.value -> filter.inp;
103+
source.end -> runner.finish;
104+
105+
}

0 commit comments

Comments
 (0)