mirror of
https://github.com/danog/ir.git
synced 2025-01-22 05:31:32 +01:00
Add README.md
This commit is contained in:
parent
b68c4db601
commit
fd2cb71d7f
315
README.md
Normal file
315
README.md
Normal file
@ -0,0 +1,315 @@
|
||||
# IR - Lightweight JIT Compilation Framework
|
||||
|
||||
The main task of this framework is transformation of the IR (Intermediate
|
||||
Representation) into an optimized in-memory target machine code, that may
|
||||
be directly executed.
|
||||
|
||||
This is not a stable finished product yet. It’s used as a base for development
|
||||
of the next generation JIT compiler for PHP-9. There are a lot of required
|
||||
things are not implemented yet.
|
||||
|
||||
## IR - Intermediate Representation
|
||||
|
||||
The Framework uses single Medium level Intermediate Representation during all
|
||||
phases of optimization, register allocation and code generation. It is inspired
|
||||
by Sea-Of-Nodes introduced by Cliff Click [1]. Sea-Of-Nodes is used in Java
|
||||
HotSpot Server Compiler, V8 TurboFan JavaScript Compiler, Java Graal
|
||||
Compiler...
|
||||
|
||||
This representation unifies data and control dependencies into a single graph,
|
||||
where each instruction represented as a Node and each dependency as an Edge
|
||||
between Nodes. There are no classical CFG (Control Flow Graph) with Basic
|
||||
Blocks. Instead, IR uses special Control Nodes that start and finish some
|
||||
code Regions. The data part of the IR is very similar to SSA (Static Single
|
||||
Assignment) form. Each variable may be assigned only once, but except to SSA,
|
||||
in our IR, we don’t have any variables, their versions and name. Everything
|
||||
is represented by computation Nodes and Edges between them. Of course, we
|
||||
have special PHI Node that represents the Phi() function.
|
||||
|
||||
Despite, our IR is graph based, internally, it’s represented as a plain
|
||||
two-way grow-able array of Nodes. Dependency Edge are represented as indexes
|
||||
of the other Node. This physical representation is almost completely repeats
|
||||
the LuaJIT IR designed by Mike Pall [3].
|
||||
|
||||
## IR Generation
|
||||
|
||||
TODO...
|
||||
|
||||
## IR Optimization
|
||||
|
||||
In comparison to classical optimizing compilers (like GCC and LLVM), IR
|
||||
Framework uses very short optimization pipeline. Together with compact IR
|
||||
representation, this makes it extremely fast and allows to generate quite
|
||||
good machine code in reasonable time.
|
||||
|
||||
### Folding
|
||||
|
||||
Folding is done on the fly, during IR generation. It performs a set of local
|
||||
transformations, but because of the graph nature of the IR where most data
|
||||
operations (like ADD) are “floating” (not “pinned” to Basic Block), the scope
|
||||
of transformations is not limited by Basic Block. It’s important to generate
|
||||
IR in a proper (Reverse Post) order, that would emit all Nodes before their
|
||||
first usage. (In case of different order the scope of the folding should be
|
||||
limited).
|
||||
|
||||
Folding Engine performs Constants Folding, Copy Propagation, Algebraic
|
||||
Simplifications, Algebraic Re-Association and Common Sub-Expression
|
||||
Elimination. The simple and fast declarative implementation is borrowed from
|
||||
LuaJIT [3].
|
||||
|
||||
### Sparse Conditional Constant Propagation
|
||||
|
||||
This pass implements a classical algorithm originally designed by M. N. Wegman
|
||||
and F. K. Zadeck [4] for SSA form. Unification of data and control dependencies
|
||||
made its implementation even simple. Despite of constant propagation itself
|
||||
this pass also performs global Copy Propagation and re-applies the folding rules.
|
||||
At the end all the “dead” instructions (instructions that result are not used)
|
||||
are replaced with NOPs.
|
||||
|
||||
### Global Code Motion
|
||||
|
||||
Now we have to “fix” places of “floating” instructions. This pass builds CFG
|
||||
(Control Flow Graph) skeleton and then ”pin” each “floating” instruction to the
|
||||
best Basic Block. The algorithm is developed by Cliff Click [2].
|
||||
|
||||
## Local Scheduling
|
||||
|
||||
As the final IR transformation pass, we reorder instructions inside each Basic
|
||||
Block to satisfy the dependencies. Currently this is done by a simple
|
||||
topological sorting.
|
||||
|
||||
## Target Instruction Selection
|
||||
|
||||
This is the first target dependent step of compilation. It aims to combine
|
||||
instruction Nodes into tiles that allows better instruction fusion. For example
|
||||
``10 + a + b * 4`` may be calculated by a single x86 instruction
|
||||
``lea 10(%eax, %ebx, 4), %ecx``. The selection is done by a constrained tree
|
||||
pattern matching. The current implementation uses simple Max-Munch approach.
|
||||
(This may be replaced by a smarter BURS method).
|
||||
|
||||
## Register Allocation
|
||||
|
||||
CPU independent implementation of Linear Scan Register Allocation for SSA form
|
||||
with second chance bin-packing. [5] [6]
|
||||
|
||||
## Machine Code Generations
|
||||
|
||||
IR Framework implements X86_64, x86 and AAtch64 back-ends. The current
|
||||
implementation uses DynAsm [?]. (In the future, this should be replaced with
|
||||
a faster “binary” encoder). Code generator walks throw all instructions of each
|
||||
basic blocks and emits some code according to “rules” selected during
|
||||
instruction selection pass. It uses registers, selected by register allocator
|
||||
and inserts the necessary spill load/store and SSA deconstruction code.
|
||||
|
||||
## Tooling
|
||||
|
||||
- Ability to load and save IR in a textual form
|
||||
- Ability to visualize IR graph through graphviz dot.
|
||||
- Target CPU disassembler for generated code (uses libcapstone [?])
|
||||
- GDB/JIT interface to allow debugging of JIT-ed code
|
||||
- Linux perf interface to analyze the code performance
|
||||
|
||||
## IR Example
|
||||
|
||||
Let's try to generate code for the following function:
|
||||
|
||||
```c
|
||||
int32_t mandelbrot(double x, double y)
|
||||
{
|
||||
double cr = y - 0.5;
|
||||
double ci = x;
|
||||
double zi = 0.0;
|
||||
double zr = 0.0;
|
||||
int i = 0;
|
||||
|
||||
while(1) {
|
||||
i ++;
|
||||
double temp = zr * zi;
|
||||
double zr2 = zr * zr;
|
||||
double zi2 = zi * zi;
|
||||
zr = zr2 - zi2 + cr;
|
||||
zi = temp + temp + ci;
|
||||
if (zi2 + zr2 > 16)
|
||||
return i;
|
||||
if (i > 1000)
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
This may be done through IR construction API by the following code:
|
||||
|
||||
```c
|
||||
void gen_mandelbrot(ir_ctx *ctx)
|
||||
{
|
||||
ir_ref start = ir_emit0(ctx, IR_START);
|
||||
ir_ref ret;
|
||||
|
||||
ir_ref x_1 = ir_param(ctx, IR_DOUBLE, start, "x", 0);
|
||||
ir_ref y_1 = ir_param(ctx, IR_DOUBLE, start, "y", 1);
|
||||
|
||||
ir_ref cr = ir_var(ctx, IR_DOUBLE, start, "cr");
|
||||
ir_ref cr_1 = ir_fold2(ctx, IR_OPT(IR_SUB, IR_DOUBLE), y_1,
|
||||
ir_const_double(ctx, 0.5));
|
||||
ir_ref ci = ir_var(ctx, IR_DOUBLE, start, "ci");
|
||||
ir_ref zi = ir_var(ctx, IR_DOUBLE, start, "zi");
|
||||
ir_ref zr = ir_var(ctx, IR_DOUBLE, start, "zr");
|
||||
ir_ref i = ir_var(ctx, IR_I32, start, "i");
|
||||
|
||||
ir_ref e_1 = ir_emit1(ctx, IR_END, start);
|
||||
ir_ref l_1 = ir_emit1(ctx, IR_LOOP_BEGIN, e_1);
|
||||
|
||||
ir_ref zi_1 = ir_emit2(ctx, IR_OPT(IR_PHI, IR_DOUBLE), l_1,
|
||||
ir_const_double(ctx, 0.0));
|
||||
ir_ref zr_1 = ir_emit2(ctx, IR_OPT(IR_PHI, IR_DOUBLE), l_1,
|
||||
ir_const_double(ctx, 0.0));
|
||||
ir_ref i_1 = ir_emit2(ctx, IR_OPT(IR_PHI, IR_I32), l_1,
|
||||
ir_const_i32(ctx, 0));
|
||||
ir_ref i_2 = ir_emit2(ctx, IR_OPT(IR_ADD, IR_I32), i_1,
|
||||
ir_const_i32(ctx, 1));
|
||||
ir_ref temp = ir_var(ctx, IR_DOUBLE, l_1, "temp");
|
||||
ir_ref temp_1 = ir_fold2(ctx, IR_OPT(IR_MUL, IR_DOUBLE), zr_1, zi_1);
|
||||
ir_ref zr2 = ir_var(ctx, IR_DOUBLE, l_1, "zr2");
|
||||
ir_ref zr2_1 = ir_fold2(ctx, IR_OPT(IR_MUL, IR_DOUBLE), zr_1, zr_1);
|
||||
ir_ref zi2 = ir_var(ctx, IR_DOUBLE, l_1, "zi2");
|
||||
ir_ref zi2_1 = ir_fold2(ctx, IR_OPT(IR_MUL, IR_DOUBLE), zi_1, zi_1);
|
||||
ir_ref zr_2 = ir_fold2(ctx, IR_OPT(IR_ADD, IR_DOUBLE),
|
||||
ir_fold2(ctx, IR_OPT(IR_SUB, IR_DOUBLE), zr2_1, zi2_1),
|
||||
cr_1);
|
||||
ir_ref zi_2 = ir_fold2(ctx, IR_OPT(IR_ADD, IR_DOUBLE),
|
||||
ir_fold2(ctx, IR_OPT(IR_ADD, IR_DOUBLE), temp_1, temp_1),
|
||||
x_1);
|
||||
|
||||
ir_ref if_1 = ir_emit2(ctx, IR_IF, l_1,
|
||||
ir_fold2(ctx, IR_OPT(IR_GT, IR_BOOL),
|
||||
ir_fold2(ctx, IR_OPT(IR_ADD, IR_DOUBLE), zi2_1, zr2_1),
|
||||
ir_const_double(ctx, 16.0)));
|
||||
|
||||
ir_ref r_1 = ir_emit1(ctx, IR_IF_TRUE, if_1);
|
||||
ret = ir_emit2(ctx, IR_OPT(IR_RETURN, IR_I32), r_1, i_2);
|
||||
|
||||
ir_ref r_2 = ir_emit1(ctx, IR_IF_FALSE, if_1);
|
||||
|
||||
ir_ref if_2 = ir_emit2(ctx, IR_IF, r_2,
|
||||
ir_fold2(ctx, IR_OPT(IR_GT, IR_BOOL), i_2, ir_const_i32(ctx, 1000)));
|
||||
|
||||
ir_ref r_3 = ir_emit1(ctx, IR_IF_TRUE, if_2);
|
||||
|
||||
ret = ir_emit3(ctx, IR_OPT(IR_RETURN, IR_I32), r_3, ir_const_i32(ctx, 0), ret);
|
||||
|
||||
ir_ref r_4 = ir_emit1(ctx, IR_IF_FALSE, if_2);
|
||||
|
||||
ir_ref l_2 = ir_emit2(ctx, IR_LOOP_END, r_4, l_1);
|
||||
|
||||
ir_set_op2(ctx, l_1, l_2);
|
||||
ir_set_op3(ctx, zi_1, zi_2);
|
||||
ir_set_op3(ctx, zr_1, zr_2);
|
||||
ir_set_op3(ctx, i_1, i_2);
|
||||
|
||||
ir_set_op1(ctx, start, ret);
|
||||
}
|
||||
```
|
||||
The textual representation of the IR after system independent optimizations:
|
||||
|
||||
```
|
||||
{
|
||||
uintptr_t c_1 = 0;
|
||||
bool c_2 = 0;
|
||||
bool c_3 = 1;
|
||||
double c_4 = 0.5;
|
||||
double c_5 = 0;
|
||||
int32_t c_6 = 0;
|
||||
int32_t c_7 = 1;
|
||||
double c_8 = 16;
|
||||
int32_t c_9 = 1000;
|
||||
l_1 = START(l_30);
|
||||
double d_2 = PARAM(l_1, "x", 0);
|
||||
double d_3 = PARAM(l_1, "y", 1);
|
||||
double d_4 = VAR(l_1, "cr");
|
||||
double d_5 = SUB(d_3, c_4);
|
||||
double d_6 = VAR(l_1, "ci");
|
||||
double d_7 = VAR(l_1, "zi");
|
||||
double d_8 = VAR(l_1, "zr");
|
||||
int32_t d_9 = VAR(l_1, "i");
|
||||
l_10 = END(l_1);
|
||||
l_11 = LOOP_BEGIN(l_10, l_37);
|
||||
double d_12 = PHI(l_11, c_5, d_36);
|
||||
double d_13 = PHI(l_11, c_5, d_34);
|
||||
int32_t d_14 = PHI(l_11, c_6, d_15);
|
||||
int32_t d_15 = ADD(d_14, c_7);
|
||||
double d_16 = VAR(l_11, "temp");
|
||||
double d_17 = VAR(l_11, "zr2");
|
||||
double d_18 = MUL(d_13, d_13);
|
||||
double d_19 = VAR(l_11, "zi2");
|
||||
double d_20 = MUL(d_12, d_12);
|
||||
double d_21 = ADD(d_20, d_18);
|
||||
bool d_22 = GT(d_21, c_8);
|
||||
l_23 = IF(l_11, d_22);
|
||||
l_24 = IF_TRUE(l_23);
|
||||
l_25 = RETURN(l_24, d_15);
|
||||
l_26 = IF_FALSE(l_23);
|
||||
bool d_27 = GT(d_15, c_9);
|
||||
l_28 = IF(l_26, d_27);
|
||||
l_29 = IF_TRUE(l_28);
|
||||
l_30 = RETURN(l_29, c_6, l_25);
|
||||
l_31 = IF_FALSE(l_28);
|
||||
double d_32 = MUL(d_12, d_13);
|
||||
double d_33 = SUB(d_18, d_20);
|
||||
double d_34 = ADD(d_33, d_5);
|
||||
double d_35 = ADD(d_32, d_32);
|
||||
double d_36 = ADD(d_35, d_2);
|
||||
l_37 = LOOP_END(l_31, l_11);
|
||||
}
|
||||
```
|
||||
The visualized graph:
|
||||
|
||||
![IR example](example.svg)
|
||||
|
||||
The final generated code:
|
||||
|
||||
```asm
|
||||
test:
|
||||
subsd .L4(%rip), %xmm1
|
||||
xorpd %xmm3, %xmm3
|
||||
xorpd %xmm2, %xmm2
|
||||
xorl %eax, %eax
|
||||
.L1:
|
||||
leal 1(%rax), %eax
|
||||
movapd %xmm2, %xmm4
|
||||
mulsd %xmm2, %xmm4
|
||||
movapd %xmm3, %xmm5
|
||||
mulsd %xmm3, %xmm5
|
||||
movapd %xmm5, %xmm6
|
||||
addsd %xmm4, %xmm6
|
||||
ucomisd .L5(%rip), %xmm6
|
||||
ja .L2
|
||||
cmpl $0x3e8, %eax
|
||||
jg .L3
|
||||
mulsd %xmm2, %xmm3
|
||||
subsd %xmm5, %xmm4
|
||||
movapd %xmm4, %xmm2
|
||||
addsd %xmm1, %xmm2
|
||||
addsd %xmm3, %xmm3
|
||||
addsd %xmm0, %xmm3
|
||||
jmp .L1
|
||||
.L2:
|
||||
retq
|
||||
.L3:
|
||||
xorl %eax, %eax
|
||||
retq
|
||||
.rodata
|
||||
.L4:
|
||||
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f
|
||||
.L5:
|
||||
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40
|
||||
```
|
||||
|
||||
## References
|
||||
|
||||
1. C. Click, M. Paleczny. “A Simple Graph-Based Intermediate Representation” In ACM SIGPLAN Workshop on Intermediate Representations (IR '95), pages 35-49, Jan. 1995.
|
||||
2. C. Click. “Global Code Motion Global Value Numbering” In ACM SIGPLAN Notices, Volume 30, Issue 6, pp 246–257, June 1995
|
||||
3. M. Pall. “LuaJIT 2.0 intellectual property disclosure and research opportunities” November 2009 http://mad.web.cern.ch/mad/releases/madng/madng-git/lib/patches/LuaJIT%202.0%20notes%20from%20M.Pall.pdf
|
||||
4. M. N. Wegman and F. K. Zadeck. "Constant propagation with conditional branches" ACM Transactions on Programming Languages and Systems, 13(2):181-210, April 1991
|
||||
5. C. Wimmer. “Optimized Interval Splitting in a Linear Scan Register Allocator” In VEE '05: Proceedings of the 1st ACM/USENIX international conference on Virtual execution environments, pages 132–141, June 2005
|
||||
6. C. Wimmer and M. Franz. “Linear Scan Register Allocation on SSA Form” In CGO '10: Proceedings of the 8-th annual IEEE/ACM international symposium on Code generation and optimization, pages 170–179, April 2010
|
661
example.svg
Normal file
661
example.svg
Normal file
@ -0,0 +1,661 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 2.48.0 (0)
|
||||
-->
|
||||
<!-- Title: ir Pages: 1 -->
|
||||
<svg width="2379pt" height="1052pt"
|
||||
viewBox="0.00 0.00 2378.99 1052.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1048)">
|
||||
<title>ir</title>
|
||||
<polygon fill="white" stroke="transparent" points="-4,4 -4,-1048 2374.99,-1048 2374.99,4 -4,4"/>
|
||||
<!-- c9 -->
|
||||
<g id="node1" class="node">
|
||||
<title>c9</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="530.69" cy="-882" rx="91.78" ry="18"/>
|
||||
<text text-anchor="middle" x="530.69" y="-878.3" font-family="Times,serif" font-size="14.00">C9: CONST I32(1000)</text>
|
||||
</g>
|
||||
<!-- n27 -->
|
||||
<g id="node40" class="node">
|
||||
<title>n27</title>
|
||||
<polygon fill="deepskyblue" stroke="black" points="400.69,-540 313.55,-522 400.69,-504 487.83,-522 400.69,-540"/>
|
||||
<text text-anchor="middle" x="400.69" y="-518.3" font-family="Times,serif" font-size="14.00">27: GT BOOL</text>
|
||||
</g>
|
||||
<!-- c9->n27 -->
|
||||
<g id="edge43" class="edge">
|
||||
<title>c9->n27</title>
|
||||
<path fill="none" stroke="blue" d="M530.69,-863.95C530.69,-837.29 530.69,-784.11 530.69,-739 530.69,-739 530.69,-739 530.69,-665 530.69,-621.63 519.63,-608.3 490.69,-576 476.5,-560.16 456.43,-547.71 438.83,-538.87"/>
|
||||
<polygon fill="blue" stroke="blue" points="439.9,-535.5 429.37,-534.33 436.87,-541.81 439.9,-535.5"/>
|
||||
</g>
|
||||
<!-- c8 -->
|
||||
<g id="node2" class="node">
|
||||
<title>c8</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="1712.69" cy="-306" rx="106.68" ry="18"/>
|
||||
<text text-anchor="middle" x="1712.69" y="-302.3" font-family="Times,serif" font-size="14.00">C8: CONST DOUBLE(16)</text>
|
||||
</g>
|
||||
<!-- n22 -->
|
||||
<g id="node35" class="node">
|
||||
<title>n22</title>
|
||||
<polygon fill="deepskyblue" stroke="black" points="1473.69,-252 1386.55,-234 1473.69,-216 1560.83,-234 1473.69,-252"/>
|
||||
<text text-anchor="middle" x="1473.69" y="-230.3" font-family="Times,serif" font-size="14.00">22: GT BOOL</text>
|
||||
</g>
|
||||
<!-- c8->n22 -->
|
||||
<g id="edge35" class="edge">
|
||||
<title>c8->n22</title>
|
||||
<path fill="none" stroke="blue" d="M1662.01,-290.15C1619.1,-277.59 1558.22,-259.76 1517.42,-247.81"/>
|
||||
<polygon fill="blue" stroke="blue" points="1518.34,-244.43 1507.75,-244.98 1516.37,-251.15 1518.34,-244.43"/>
|
||||
</g>
|
||||
<!-- c7 -->
|
||||
<g id="node3" class="node">
|
||||
<title>c7</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="300.69" cy="-666" rx="78.79" ry="18"/>
|
||||
<text text-anchor="middle" x="300.69" y="-662.3" font-family="Times,serif" font-size="14.00">C7: CONST I32(1)</text>
|
||||
</g>
|
||||
<!-- n15 -->
|
||||
<g id="node28" class="node">
|
||||
<title>n15</title>
|
||||
<polygon fill="deepskyblue" stroke="black" points="400.69,-612 319.92,-594 400.69,-576 481.47,-594 400.69,-612"/>
|
||||
<text text-anchor="middle" x="400.69" y="-590.3" font-family="Times,serif" font-size="14.00">15: ADD I32</text>
|
||||
</g>
|
||||
<!-- c7->n15 -->
|
||||
<g id="edge24" class="edge">
|
||||
<title>c7->n15</title>
|
||||
<path fill="none" stroke="blue" d="M323.89,-648.76C338.78,-638.34 358.19,-624.75 373.77,-613.85"/>
|
||||
<polygon fill="blue" stroke="blue" points="375.79,-616.71 381.97,-608.1 371.77,-610.97 375.79,-616.71"/>
|
||||
</g>
|
||||
<!-- c6 -->
|
||||
<g id="node4" class="node">
|
||||
<title>c6</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="343.69" cy="-738" rx="78.79" ry="18"/>
|
||||
<text text-anchor="middle" x="343.69" y="-734.3" font-family="Times,serif" font-size="14.00">C6: CONST I32(0)</text>
|
||||
</g>
|
||||
<!-- n30 -->
|
||||
<g id="node11" class="node">
|
||||
<title>n30</title>
|
||||
<path fill="red" stroke="black" d="M303.69,-36C303.69,-36 235.69,-36 235.69,-36 229.69,-36 223.69,-30 223.69,-24 223.69,-24 223.69,-12 223.69,-12 223.69,-6 229.69,0 235.69,0 235.69,0 303.69,0 303.69,0 309.69,0 315.69,-6 315.69,-12 315.69,-12 315.69,-24 315.69,-24 315.69,-30 309.69,-36 303.69,-36"/>
|
||||
<text text-anchor="middle" x="269.69" y="-14.3" font-family="Times,serif" font-size="14.00">30: RETURN</text>
|
||||
</g>
|
||||
<!-- c6->n30 -->
|
||||
<g id="edge48" class="edge">
|
||||
<title>c6->n30</title>
|
||||
<path fill="none" stroke="blue" d="M284.42,-726.04C258.87,-718.39 230.76,-705.52 212.69,-684 186.69,-653.02 193.69,-635.45 193.69,-595 193.69,-595 193.69,-595 193.69,-161 193.69,-115.64 224.21,-70.75 246.57,-43.95"/>
|
||||
<polygon fill="blue" stroke="blue" points="249.34,-46.09 253.2,-36.23 244.03,-41.53 249.34,-46.09"/>
|
||||
</g>
|
||||
<!-- n14 -->
|
||||
<g id="node27" class="node">
|
||||
<title>n14</title>
|
||||
<ellipse fill="deepskyblue" stroke="black" cx="449.69" cy="-666" rx="52.79" ry="18"/>
|
||||
<text text-anchor="middle" x="449.69" y="-662.3" font-family="Times,serif" font-size="14.00">14: PHI I32</text>
|
||||
</g>
|
||||
<!-- c6->n14 -->
|
||||
<g id="edge21" class="edge">
|
||||
<title>c6->n14</title>
|
||||
<path fill="none" stroke="blue" d="M368.28,-720.76C383.04,-711.02 401.97,-698.52 417.86,-688.02"/>
|
||||
<polygon fill="blue" stroke="blue" points="419.92,-690.86 426.33,-682.43 416.06,-685.02 419.92,-690.86"/>
|
||||
</g>
|
||||
<!-- c5 -->
|
||||
<g id="node5" class="node">
|
||||
<title>c5</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="1377.69" cy="-810" rx="102.88" ry="18"/>
|
||||
<text text-anchor="middle" x="1377.69" y="-806.3" font-family="Times,serif" font-size="14.00">C5: CONST DOUBLE(0)</text>
|
||||
</g>
|
||||
<!-- n12 -->
|
||||
<g id="node23" class="node">
|
||||
<title>n12</title>
|
||||
<ellipse fill="deepskyblue" stroke="black" cx="1347.69" cy="-450" rx="76.89" ry="18"/>
|
||||
<text text-anchor="middle" x="1347.69" y="-446.3" font-family="Times,serif" font-size="14.00">12: PHI DOUBLE</text>
|
||||
</g>
|
||||
<!-- c5->n12 -->
|
||||
<g id="edge15" class="edge">
|
||||
<title>c5->n12</title>
|
||||
<path fill="none" stroke="blue" d="M1323.93,-794.63C1266.83,-775.73 1184.69,-736.47 1184.69,-667 1184.69,-667 1184.69,-667 1184.69,-593 1184.69,-550.33 1190.69,-534.34 1220.69,-504 1238.11,-486.39 1262.26,-474.35 1284.82,-466.26"/>
|
||||
<polygon fill="blue" stroke="blue" points="1286.02,-469.54 1294.37,-463.02 1283.77,-462.91 1286.02,-469.54"/>
|
||||
</g>
|
||||
<!-- n13 -->
|
||||
<g id="node25" class="node">
|
||||
<title>n13</title>
|
||||
<ellipse fill="deepskyblue" stroke="black" cx="1034.69" cy="-738" rx="76.89" ry="18"/>
|
||||
<text text-anchor="middle" x="1034.69" y="-734.3" font-family="Times,serif" font-size="14.00">13: PHI DOUBLE</text>
|
||||
</g>
|
||||
<!-- c5->n13 -->
|
||||
<g id="edge18" class="edge">
|
||||
<title>c5->n13</title>
|
||||
<path fill="none" stroke="blue" d="M1313.58,-795.92C1252.78,-783.51 1161.86,-764.95 1100.51,-752.43"/>
|
||||
<polygon fill="blue" stroke="blue" points="1101.05,-748.97 1090.55,-750.4 1099.65,-755.83 1101.05,-748.97"/>
|
||||
</g>
|
||||
<!-- c4 -->
|
||||
<g id="node6" class="node">
|
||||
<title>c4</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="1166.69" cy="-954" rx="109.38" ry="18"/>
|
||||
<text text-anchor="middle" x="1166.69" y="-950.3" font-family="Times,serif" font-size="14.00">C4: CONST DOUBLE(0.5)</text>
|
||||
</g>
|
||||
<!-- n5 -->
|
||||
<g id="node15" class="node">
|
||||
<title>n5</title>
|
||||
<polygon fill="deepskyblue" stroke="black" points="936.69,-900 829.95,-882 936.69,-864 1043.44,-882 936.69,-900"/>
|
||||
<text text-anchor="middle" x="936.69" y="-878.3" font-family="Times,serif" font-size="14.00">5: SUB DOUBLE</text>
|
||||
</g>
|
||||
<!-- c4->n5 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>c4->n5</title>
|
||||
<path fill="none" stroke="blue" d="M1117.07,-937.9C1077.19,-925.76 1021.6,-908.84 982.7,-897"/>
|
||||
<polygon fill="blue" stroke="blue" points="983.29,-893.52 972.7,-893.96 981.25,-900.22 983.29,-893.52"/>
|
||||
</g>
|
||||
<!-- c3 -->
|
||||
<g id="node7" class="node">
|
||||
<title>c3</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="633.69" cy="-162" rx="90.98" ry="18"/>
|
||||
<text text-anchor="middle" x="633.69" y="-158.3" font-family="Times,serif" font-size="14.00">C3: CONST BOOL(1)</text>
|
||||
</g>
|
||||
<!-- c2 -->
|
||||
<g id="node8" class="node">
|
||||
<title>c2</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="593.69" cy="-18" rx="90.98" ry="18"/>
|
||||
<text text-anchor="middle" x="593.69" y="-14.3" font-family="Times,serif" font-size="14.00">C2: CONST BOOL(0)</text>
|
||||
</g>
|
||||
<!-- c1 -->
|
||||
<g id="node9" class="node">
|
||||
<title>c1</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="1390.69" cy="-1026" rx="91.78" ry="18"/>
|
||||
<text text-anchor="middle" x="1390.69" y="-1022.3" font-family="Times,serif" font-size="14.00">C1: CONST ADDR(0)</text>
|
||||
</g>
|
||||
<!-- n1 -->
|
||||
<g id="node10" class="node">
|
||||
<title>n1</title>
|
||||
<path fill="red" stroke="black" d="M1268.69,-1044C1268.69,-1044 1218.69,-1044 1218.69,-1044 1212.69,-1044 1206.69,-1038 1206.69,-1032 1206.69,-1032 1206.69,-1020 1206.69,-1020 1206.69,-1014 1212.69,-1008 1218.69,-1008 1218.69,-1008 1268.69,-1008 1268.69,-1008 1274.69,-1008 1280.69,-1014 1280.69,-1020 1280.69,-1020 1280.69,-1032 1280.69,-1032 1280.69,-1038 1274.69,-1044 1268.69,-1044"/>
|
||||
<text text-anchor="middle" x="1243.69" y="-1022.3" font-family="Times,serif" font-size="14.00">1: START</text>
|
||||
</g>
|
||||
<!-- n1->n30 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>n1->n30</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1206.56,-1024.15C1015.87,-1019.3 155.69,-991.4 155.69,-883 155.69,-883 155.69,-883 155.69,-161 155.69,-110 200.97,-66.88 234.45,-41.97"/>
|
||||
<polygon fill="black" stroke="black" points="236.62,-44.73 242.68,-36.04 232.52,-39.05 236.62,-44.73"/>
|
||||
</g>
|
||||
<!-- n10 -->
|
||||
<g id="node20" class="node">
|
||||
<title>n10</title>
|
||||
<polygon fill="lightcoral" stroke="black" points="837.19,-828 772.19,-828 772.19,-792 837.19,-792 837.19,-828"/>
|
||||
<text text-anchor="middle" x="804.69" y="-806.3" font-family="Times,serif" font-size="14.00">10: END</text>
|
||||
</g>
|
||||
<!-- n1->n10 -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>n1->n10</title>
|
||||
<path fill="none" stroke="red" stroke-width="2" d="M1206.43,-1022.95C1108.12,-1017.19 847.46,-999.46 820.69,-972 786.31,-936.73 791.53,-874.23 798.22,-838.36"/>
|
||||
<polygon fill="red" stroke="red" stroke-width="2" points="801.74,-838.64 800.31,-828.14 794.88,-837.24 801.74,-838.64"/>
|
||||
</g>
|
||||
<!-- n25 -->
|
||||
<g id="node38" class="node">
|
||||
<title>n25</title>
|
||||
<path fill="red" stroke="black" d="M472.69,-36C472.69,-36 404.69,-36 404.69,-36 398.69,-36 392.69,-30 392.69,-24 392.69,-24 392.69,-12 392.69,-12 392.69,-6 398.69,0 404.69,0 404.69,0 472.69,0 472.69,0 478.69,0 484.69,-6 484.69,-12 484.69,-12 484.69,-24 484.69,-24 484.69,-30 478.69,-36 472.69,-36"/>
|
||||
<text text-anchor="middle" x="438.69" y="-14.3" font-family="Times,serif" font-size="14.00">25: RETURN</text>
|
||||
</g>
|
||||
<!-- n30->n25 -->
|
||||
<g id="edge49" class="edge">
|
||||
<title>n30->n25</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M315.91,-18C338.09,-18 360.27,-18 382.46,-18"/>
|
||||
<polygon fill="black" stroke="black" points="382.65,-21.5 392.65,-18 382.65,-14.5 382.65,-21.5"/>
|
||||
</g>
|
||||
<!-- n2 -->
|
||||
<g id="node12" class="node">
|
||||
<title>n2</title>
|
||||
<ellipse fill="lightblue" stroke="black" cx="1679.69" cy="-738" rx="104.78" ry="18"/>
|
||||
<text text-anchor="middle" x="1679.69" y="-734.3" font-family="Times,serif" font-size="14.00">2: PARAM DOUBLE "x"</text>
|
||||
</g>
|
||||
<!-- n2->n1 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>n2->n1</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1671.38,-756.21C1647.3,-805.36 1576.54,-944.58 1534.69,-972 1445.33,-1030.55 1399.08,-983.7 1290.87,-1008.11"/>
|
||||
<polygon fill="black" stroke="black" points="1289.79,-1004.76 1280.89,-1010.51 1291.44,-1011.57 1289.79,-1004.76"/>
|
||||
</g>
|
||||
<!-- n36 -->
|
||||
<g id="node24" class="node">
|
||||
<title>n36</title>
|
||||
<polygon fill="deepskyblue" stroke="black" points="1365.69,-540 1250.9,-522 1365.69,-504 1480.48,-522 1365.69,-540"/>
|
||||
<text text-anchor="middle" x="1365.69" y="-518.3" font-family="Times,serif" font-size="14.00">36: ADD DOUBLE</text>
|
||||
</g>
|
||||
<!-- n2->n36 -->
|
||||
<g id="edge60" class="edge">
|
||||
<title>n2->n36</title>
|
||||
<path fill="none" stroke="blue" d="M1663.25,-720.02C1631.88,-688.38 1560.32,-619.63 1489.69,-576 1464.64,-560.52 1434.26,-547.45 1409.85,-538.17"/>
|
||||
<polygon fill="blue" stroke="blue" points="1411.06,-534.89 1400.47,-534.68 1408.62,-541.45 1411.06,-534.89"/>
|
||||
</g>
|
||||
<!-- n3 -->
|
||||
<g id="node13" class="node">
|
||||
<title>n3</title>
|
||||
<ellipse fill="lightblue" stroke="black" cx="934.69" cy="-954" rx="104.78" ry="18"/>
|
||||
<text text-anchor="middle" x="934.69" y="-950.3" font-family="Times,serif" font-size="14.00">3: PARAM DOUBLE "y"</text>
|
||||
</g>
|
||||
<!-- n3->n1 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>n3->n1</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M995.22,-968.71C1054.15,-982.06 1142.5,-1002.08 1196.44,-1014.29"/>
|
||||
<polygon fill="black" stroke="black" points="1195.9,-1017.76 1206.42,-1016.56 1197.44,-1010.93 1195.9,-1017.76"/>
|
||||
</g>
|
||||
<!-- n3->n5 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>n3->n5</title>
|
||||
<path fill="none" stroke="blue" d="M935.19,-935.7C935.41,-927.98 935.67,-918.71 935.92,-910.11"/>
|
||||
<polygon fill="blue" stroke="blue" points="939.42,-910.2 936.21,-900.1 932.42,-910 939.42,-910.2"/>
|
||||
</g>
|
||||
<!-- n4 -->
|
||||
<g id="node14" class="node">
|
||||
<title>n4</title>
|
||||
<ellipse fill="none" stroke="black" cx="1673.69" cy="-954" rx="92.08" ry="18"/>
|
||||
<text text-anchor="middle" x="1673.69" y="-950.3" font-family="Times,serif" font-size="14.00">4: VAR DOUBLE "cr"</text>
|
||||
</g>
|
||||
<!-- n4->n1 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>n4->n1</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1605.6,-966.23C1593.01,-968.22 1579.96,-970.22 1567.69,-972 1447.65,-989.4 1412.51,-978.81 1290.95,-1008"/>
|
||||
<polygon fill="black" stroke="black" points="1289.76,-1004.69 1280.88,-1010.46 1291.43,-1011.49 1289.76,-1004.69"/>
|
||||
</g>
|
||||
<!-- n34 -->
|
||||
<g id="node26" class="node">
|
||||
<title>n34</title>
|
||||
<polygon fill="deepskyblue" stroke="black" points="1141.69,-828 1026.9,-810 1141.69,-792 1256.48,-810 1141.69,-828"/>
|
||||
<text text-anchor="middle" x="1141.69" y="-806.3" font-family="Times,serif" font-size="14.00">34: ADD DOUBLE</text>
|
||||
</g>
|
||||
<!-- n5->n34 -->
|
||||
<g id="edge56" class="edge">
|
||||
<title>n5->n34</title>
|
||||
<path fill="none" stroke="blue" d="M970.09,-869.6C1004.77,-857.76 1059.21,-839.17 1097.45,-826.11"/>
|
||||
<polygon fill="blue" stroke="blue" points="1098.96,-829.29 1107.29,-822.75 1096.69,-822.67 1098.96,-829.29"/>
|
||||
</g>
|
||||
<!-- n6 -->
|
||||
<g id="node16" class="node">
|
||||
<title>n6</title>
|
||||
<ellipse fill="none" stroke="black" cx="1875.69" cy="-954" rx="91.78" ry="18"/>
|
||||
<text text-anchor="middle" x="1875.69" y="-950.3" font-family="Times,serif" font-size="14.00">6: VAR DOUBLE "ci"</text>
|
||||
</g>
|
||||
<!-- n6->n1 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>n6->n1</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1810.9,-966.82C1798.89,-968.75 1786.43,-970.58 1774.69,-972 1563.36,-997.57 1502.74,-963.16 1290.72,-1008.15"/>
|
||||
<polygon fill="black" stroke="black" points="1289.88,-1004.75 1280.84,-1010.28 1291.35,-1011.6 1289.88,-1004.75"/>
|
||||
</g>
|
||||
<!-- n7 -->
|
||||
<g id="node17" class="node">
|
||||
<title>n7</title>
|
||||
<ellipse fill="none" stroke="black" cx="2076.69" cy="-954" rx="91.78" ry="18"/>
|
||||
<text text-anchor="middle" x="2076.69" y="-950.3" font-family="Times,serif" font-size="14.00">7: VAR DOUBLE "zi"</text>
|
||||
</g>
|
||||
<!-- n7->n1 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>n7->n1</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M2012.83,-966.99C2000.86,-968.92 1988.42,-970.7 1976.69,-972 1676.07,-1005.32 1590.98,-947.57 1290.68,-1008.19"/>
|
||||
<polygon fill="black" stroke="black" points="1289.92,-1004.78 1280.82,-1010.21 1291.32,-1011.64 1289.92,-1004.78"/>
|
||||
</g>
|
||||
<!-- n8 -->
|
||||
<g id="node18" class="node">
|
||||
<title>n8</title>
|
||||
<ellipse fill="none" stroke="black" cx="2278.69" cy="-954" rx="92.08" ry="18"/>
|
||||
<text text-anchor="middle" x="2278.69" y="-950.3" font-family="Times,serif" font-size="14.00">8: VAR DOUBLE "zr"</text>
|
||||
</g>
|
||||
<!-- n8->n1 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>n8->n1</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M2214.75,-967.02C2202.48,-968.96 2189.72,-970.75 2177.69,-972 1788.18,-1012.51 1678.89,-931.99 1290.91,-1008.17"/>
|
||||
<polygon fill="black" stroke="black" points="1289.94,-1004.79 1280.82,-1010.17 1291.31,-1011.66 1289.94,-1004.79"/>
|
||||
</g>
|
||||
<!-- n9 -->
|
||||
<g id="node19" class="node">
|
||||
<title>n9</title>
|
||||
<ellipse fill="none" stroke="black" cx="63.69" cy="-954" rx="63.89" ry="18"/>
|
||||
<text text-anchor="middle" x="63.69" y="-950.3" font-family="Times,serif" font-size="14.00">9: VAR I32 "i"</text>
|
||||
</g>
|
||||
<!-- n9->n1 -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>n9->n1</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M110.08,-966.44C120.43,-968.62 131.39,-970.64 141.69,-972 547.29,-1025.57 1043.21,-1026.64 1196.38,-1025.53"/>
|
||||
<polygon fill="black" stroke="black" points="1196.42,-1029.03 1206.39,-1025.45 1196.36,-1022.03 1196.42,-1029.03"/>
|
||||
</g>
|
||||
<!-- n11 -->
|
||||
<g id="node21" class="node">
|
||||
<title>n11</title>
|
||||
<polygon fill="lightcoral" stroke="black" points="856.19,-252 735.19,-252 735.19,-216 856.19,-216 856.19,-252"/>
|
||||
<text text-anchor="middle" x="795.69" y="-230.3" font-family="Times,serif" font-size="14.00">11: LOOP_BEGIN</text>
|
||||
</g>
|
||||
<!-- n10->n11 -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>n10->n11</title>
|
||||
<path fill="none" stroke="red" stroke-width="2" d="M806.67,-791.98C809.58,-765.36 814.69,-712.23 814.69,-667 814.69,-667 814.69,-667 814.69,-377 814.69,-336.86 807.14,-290.9 801.56,-262.4"/>
|
||||
<polygon fill="red" stroke="red" stroke-width="2" points="804.95,-261.5 799.54,-252.39 798.09,-262.88 804.95,-261.5"/>
|
||||
</g>
|
||||
<!-- n23 -->
|
||||
<g id="node36" class="node">
|
||||
<title>n23</title>
|
||||
<polygon fill="lightcoral" stroke="black" points="524.69,-180 470.69,-180 470.69,-144 524.69,-144 524.69,-180"/>
|
||||
<text text-anchor="middle" x="497.69" y="-158.3" font-family="Times,serif" font-size="14.00">23: IF</text>
|
||||
</g>
|
||||
<!-- n11->n23 -->
|
||||
<g id="edge36" class="edge">
|
||||
<title>n11->n23</title>
|
||||
<path fill="none" stroke="red" stroke-width="2" d="M735.05,-224.98C683.56,-217.23 607.82,-203.56 534.75,-179.94"/>
|
||||
<polygon fill="red" stroke="red" stroke-width="2" points="535.52,-176.51 524.93,-176.7 533.33,-183.15 535.52,-176.51"/>
|
||||
</g>
|
||||
<!-- n37 -->
|
||||
<g id="node22" class="node">
|
||||
<title>n37</title>
|
||||
<polygon fill="lightcoral" stroke="black" points="515.19,-324 408.19,-324 408.19,-288 515.19,-288 515.19,-324"/>
|
||||
<text text-anchor="middle" x="461.69" y="-302.3" font-family="Times,serif" font-size="14.00">37: LOOP_END</text>
|
||||
</g>
|
||||
<!-- n37->n11 -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>n37->n11</title>
|
||||
<path fill="none" stroke="red" stroke-width="2" d="M515.05,-287.92C585.94,-271.33 668,-255.85 725.08,-245.97"/>
|
||||
<polygon fill="red" stroke="red" stroke-width="2" points="725.82,-249.4 735.08,-244.26 724.64,-242.5 725.82,-249.4"/>
|
||||
</g>
|
||||
<!-- n37->n11 -->
|
||||
<g id="edge62" class="edge">
|
||||
<title>n37->n11</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M515.22,-292.34C521.13,-290.81 527.04,-289.32 532.69,-288 597.6,-272.8 671.94,-258.53 725.05,-248.63"/>
|
||||
<polygon fill="black" stroke="black" points="725.85,-252.04 735.04,-246.77 724.57,-245.16 725.85,-252.04"/>
|
||||
</g>
|
||||
<!-- n12->n11 -->
|
||||
<g id="edge14" class="edge">
|
||||
<title>n12->n11</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1346.24,-431.98C1342.68,-394.58 1332.19,-306.99 1310.69,-288 1278.08,-259.18 999.97,-243.63 866.55,-237.77"/>
|
||||
<polygon fill="black" stroke="black" points="866.56,-234.27 856.42,-237.33 866.26,-241.26 866.56,-234.27"/>
|
||||
</g>
|
||||
<!-- n20 -->
|
||||
<g id="node33" class="node">
|
||||
<title>n20</title>
|
||||
<polygon fill="deepskyblue" stroke="black" points="1473.69,-396 1358.07,-378 1473.69,-360 1589.32,-378 1473.69,-396"/>
|
||||
<text text-anchor="middle" x="1473.69" y="-374.3" font-family="Times,serif" font-size="14.00">20: MUL DOUBLE</text>
|
||||
</g>
|
||||
<!-- n12->n20 -->
|
||||
<g id="edge30" class="edge">
|
||||
<title>n12->n20</title>
|
||||
<path fill="none" stroke="blue" d="M1371.12,-432.76C1389.52,-421.86 1415.33,-407.5 1436.51,-396.37"/>
|
||||
<polygon fill="blue" stroke="blue" points="1438.32,-399.37 1445.58,-391.66 1435.09,-393.16 1438.32,-399.37"/>
|
||||
</g>
|
||||
<!-- n12->n20 -->
|
||||
<g id="edge31" class="edge">
|
||||
<title>n12->n20</title>
|
||||
<path fill="none" stroke="blue" d="M1381.04,-433.64C1400.97,-423.26 1425.91,-409.48 1444.96,-398.36"/>
|
||||
<polygon fill="blue" stroke="blue" points="1446.97,-401.24 1453.8,-393.14 1443.41,-395.21 1446.97,-401.24"/>
|
||||
</g>
|
||||
<!-- n32 -->
|
||||
<g id="node44" class="node">
|
||||
<title>n32</title>
|
||||
<polygon fill="deepskyblue" stroke="black" points="1346.69,-684 1231.07,-666 1346.69,-648 1462.32,-666 1346.69,-684"/>
|
||||
<text text-anchor="middle" x="1346.69" y="-662.3" font-family="Times,serif" font-size="14.00">32: MUL DOUBLE</text>
|
||||
</g>
|
||||
<!-- n12->n32 -->
|
||||
<g id="edge51" class="edge">
|
||||
<title>n12->n32</title>
|
||||
<path fill="none" stroke="blue" d="M1296.86,-463.62C1276,-471.58 1253.92,-484.22 1241.69,-504 1216.46,-544.83 1216.54,-571.12 1241.69,-612 1253.24,-630.76 1273.69,-643.12 1293.5,-651.14"/>
|
||||
<polygon fill="blue" stroke="blue" points="1292.53,-654.52 1303.13,-654.74 1294.99,-647.96 1292.53,-654.52"/>
|
||||
</g>
|
||||
<!-- n36->n12 -->
|
||||
<g id="edge16" class="edge">
|
||||
<title>n36->n12</title>
|
||||
<path fill="none" stroke="blue" d="M1361.43,-504.41C1359.43,-496.62 1356.99,-487.14 1354.72,-478.33"/>
|
||||
<polygon fill="blue" stroke="blue" points="1358.06,-477.26 1352.18,-468.45 1351.28,-479 1358.06,-477.26"/>
|
||||
</g>
|
||||
<!-- n13->n11 -->
|
||||
<g id="edge17" class="edge">
|
||||
<title>n13->n11</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M988.77,-723.43C934.85,-704.34 852.69,-663.93 852.69,-595 852.69,-595 852.69,-595 852.69,-377 852.69,-336.03 845.03,-325.57 828.69,-288 824.7,-278.8 819.28,-269.33 813.98,-260.98"/>
|
||||
<polygon fill="black" stroke="black" points="816.78,-258.87 808.37,-252.43 810.93,-262.71 816.78,-258.87"/>
|
||||
</g>
|
||||
<!-- n18 -->
|
||||
<g id="node31" class="node">
|
||||
<title>n18</title>
|
||||
<polygon fill="deepskyblue" stroke="black" points="1409.69,-972 1294.07,-954 1409.69,-936 1525.32,-954 1409.69,-972"/>
|
||||
<text text-anchor="middle" x="1409.69" y="-950.3" font-family="Times,serif" font-size="14.00">18: MUL DOUBLE</text>
|
||||
</g>
|
||||
<!-- n13->n18 -->
|
||||
<g id="edge27" class="edge">
|
||||
<title>n13->n18</title>
|
||||
<path fill="none" stroke="blue" d="M1018.07,-755.76C1005.3,-775 993.1,-806.66 1008.69,-828 1048.36,-882.28 1241.62,-924.32 1344.74,-942.77"/>
|
||||
<polygon fill="blue" stroke="blue" points="1344.28,-946.24 1354.74,-944.53 1345.5,-939.35 1344.28,-946.24"/>
|
||||
</g>
|
||||
<!-- n13->n18 -->
|
||||
<g id="edge28" class="edge">
|
||||
<title>n13->n18</title>
|
||||
<path fill="none" stroke="blue" d="M1030.84,-756.1C1023.15,-775.38 1011.19,-806.79 1026.69,-828 1065.62,-881.27 1252.45,-922.74 1350.11,-941.71"/>
|
||||
<polygon fill="blue" stroke="blue" points="1349.65,-945.19 1360.13,-943.64 1350.97,-938.31 1349.65,-945.19"/>
|
||||
</g>
|
||||
<!-- n13->n32 -->
|
||||
<g id="edge52" class="edge">
|
||||
<title>n13->n32</title>
|
||||
<path fill="none" stroke="blue" d="M1087.97,-725.05C1144.78,-712.3 1234.31,-692.22 1291.75,-679.33"/>
|
||||
<polygon fill="blue" stroke="blue" points="1292.74,-682.69 1301.73,-677.09 1291.21,-675.86 1292.74,-682.69"/>
|
||||
</g>
|
||||
<!-- n34->n13 -->
|
||||
<g id="edge19" class="edge">
|
||||
<title>n34->n13</title>
|
||||
<path fill="none" stroke="blue" d="M1120.55,-795.17C1105.62,-785.4 1085.29,-772.1 1068.16,-760.9"/>
|
||||
<polygon fill="blue" stroke="blue" points="1069.83,-757.8 1059.54,-755.26 1066,-763.66 1069.83,-757.8"/>
|
||||
</g>
|
||||
<!-- n14->n11 -->
|
||||
<g id="edge20" class="edge">
|
||||
<title>n14->n11</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M502.6,-665.04C595.14,-662.02 776.69,-641.06 776.69,-523 776.69,-523 776.69,-523 776.69,-377 776.69,-336.86 784.25,-290.9 789.83,-262.4"/>
|
||||
<polygon fill="black" stroke="black" points="793.3,-262.88 791.85,-252.39 786.44,-261.5 793.3,-262.88"/>
|
||||
</g>
|
||||
<!-- n14->n15 -->
|
||||
<g id="edge23" class="edge">
|
||||
<title>n14->n15</title>
|
||||
<path fill="none" stroke="blue" d="M432.53,-648.76C425.57,-640.19 417.85,-629.49 411.63,-619.9"/>
|
||||
<polygon fill="blue" stroke="blue" points="414.45,-617.8 406.21,-611.15 408.5,-621.49 414.45,-617.8"/>
|
||||
</g>
|
||||
<!-- n15->n14 -->
|
||||
<g id="edge22" class="edge">
|
||||
<title>n15->n14</title>
|
||||
<path fill="none" stroke="blue" d="M415.99,-608.97C423.25,-617.67 431.61,-629.13 438.31,-639.42"/>
|
||||
<polygon fill="blue" stroke="blue" points="435.44,-641.43 443.71,-648.05 441.38,-637.72 435.44,-641.43"/>
|
||||
</g>
|
||||
<!-- n15->n25 -->
|
||||
<g id="edge40" class="edge">
|
||||
<title>n15->n25</title>
|
||||
<path fill="none" stroke="blue" d="M369.3,-582.8C320.43,-564.71 231.69,-522.09 231.69,-451 231.69,-451 231.69,-451 231.69,-233 231.69,-149.92 265.33,-128.01 326.69,-72 342.81,-57.29 363.73,-45.92 383.12,-37.55"/>
|
||||
<polygon fill="blue" stroke="blue" points="384.58,-40.73 392.49,-33.68 381.91,-34.26 384.58,-40.73"/>
|
||||
</g>
|
||||
<!-- n15->n27 -->
|
||||
<g id="edge42" class="edge">
|
||||
<title>n15->n27</title>
|
||||
<path fill="none" stroke="blue" d="M400.69,-575.7C400.69,-567.98 400.69,-558.71 400.69,-550.11"/>
|
||||
<polygon fill="blue" stroke="blue" points="404.19,-550.1 400.69,-540.1 397.19,-550.1 404.19,-550.1"/>
|
||||
</g>
|
||||
<!-- n16 -->
|
||||
<g id="node29" class="node">
|
||||
<title>n16</title>
|
||||
<ellipse fill="none" stroke="black" cx="640.69" cy="-306" rx="107.78" ry="18"/>
|
||||
<text text-anchor="middle" x="640.69" y="-302.3" font-family="Times,serif" font-size="14.00">16: VAR DOUBLE "temp"</text>
|
||||
</g>
|
||||
<!-- n16->n11 -->
|
||||
<g id="edge25" class="edge">
|
||||
<title>n16->n11</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M676.25,-288.94C697.7,-279.26 725.28,-266.8 748.53,-256.3"/>
|
||||
<polygon fill="black" stroke="black" points="750.19,-259.39 757.86,-252.08 747.31,-253.01 750.19,-259.39"/>
|
||||
</g>
|
||||
<!-- n17 -->
|
||||
<g id="node30" class="node">
|
||||
<title>n17</title>
|
||||
<ellipse fill="none" stroke="black" cx="981.69" cy="-306" rx="100.98" ry="18"/>
|
||||
<text text-anchor="middle" x="981.69" y="-302.3" font-family="Times,serif" font-size="14.00">17: VAR DOUBLE "zr2"</text>
|
||||
</g>
|
||||
<!-- n17->n11 -->
|
||||
<g id="edge26" class="edge">
|
||||
<title>n17->n11</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M940.41,-289.46C913.97,-279.51 879.35,-266.48 850.6,-255.66"/>
|
||||
<polygon fill="black" stroke="black" points="851.69,-252.33 841.09,-252.09 849.22,-258.88 851.69,-252.33"/>
|
||||
</g>
|
||||
<!-- n21 -->
|
||||
<g id="node34" class="node">
|
||||
<title>n21</title>
|
||||
<polygon fill="deepskyblue" stroke="black" points="1473.69,-324 1358.9,-306 1473.69,-288 1588.48,-306 1473.69,-324"/>
|
||||
<text text-anchor="middle" x="1473.69" y="-302.3" font-family="Times,serif" font-size="14.00">21: ADD DOUBLE</text>
|
||||
</g>
|
||||
<!-- n18->n21 -->
|
||||
<g id="edge33" class="edge">
|
||||
<title>n18->n21</title>
|
||||
<path fill="none" stroke="blue" d="M1455.73,-943.09C1480.59,-935.4 1509.77,-922.19 1527.69,-900 1553.11,-868.54 1546.69,-851.45 1546.69,-811 1546.69,-811 1546.69,-811 1546.69,-737 1546.69,-636.79 1617.69,-623.21 1617.69,-523 1617.69,-523 1617.69,-523 1617.69,-449 1617.69,-408.55 1624.44,-391.19 1598.69,-360 1582.01,-339.79 1556.24,-327.14 1532.43,-319.29"/>
|
||||
<polygon fill="blue" stroke="blue" points="1533.31,-315.9 1522.72,-316.31 1531.26,-322.59 1533.31,-315.9"/>
|
||||
</g>
|
||||
<!-- n33 -->
|
||||
<g id="node45" class="node">
|
||||
<title>n33</title>
|
||||
<polygon fill="deepskyblue" stroke="black" points="1406.69,-900 1294.42,-882 1406.69,-864 1518.97,-882 1406.69,-900"/>
|
||||
<text text-anchor="middle" x="1406.69" y="-878.3" font-family="Times,serif" font-size="14.00">33: SUB DOUBLE</text>
|
||||
</g>
|
||||
<!-- n18->n33 -->
|
||||
<g id="edge53" class="edge">
|
||||
<title>n18->n33</title>
|
||||
<path fill="none" stroke="blue" d="M1408.97,-936.05C1408.64,-928.35 1408.24,-919.03 1407.87,-910.36"/>
|
||||
<polygon fill="blue" stroke="blue" points="1411.36,-910.12 1407.43,-900.28 1404.37,-910.42 1411.36,-910.12"/>
|
||||
</g>
|
||||
<!-- n19 -->
|
||||
<g id="node32" class="node">
|
||||
<title>n19</title>
|
||||
<ellipse fill="none" stroke="black" cx="1200.69" cy="-306" rx="100.98" ry="18"/>
|
||||
<text text-anchor="middle" x="1200.69" y="-302.3" font-family="Times,serif" font-size="14.00">19: VAR DOUBLE "zi2"</text>
|
||||
</g>
|
||||
<!-- n19->n11 -->
|
||||
<g id="edge29" class="edge">
|
||||
<title>n19->n11</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1131.07,-292.97C1057.2,-280.2 941.09,-260.13 866.69,-247.27"/>
|
||||
<polygon fill="black" stroke="black" points="866.93,-243.76 856.48,-245.51 865.74,-250.66 866.93,-243.76"/>
|
||||
</g>
|
||||
<!-- n20->n21 -->
|
||||
<g id="edge32" class="edge">
|
||||
<title>n20->n21</title>
|
||||
<path fill="none" stroke="blue" d="M1473.69,-359.7C1473.69,-351.98 1473.69,-342.71 1473.69,-334.11"/>
|
||||
<polygon fill="blue" stroke="blue" points="1477.19,-334.1 1473.69,-324.1 1470.19,-334.1 1477.19,-334.1"/>
|
||||
</g>
|
||||
<!-- n20->n33 -->
|
||||
<g id="edge54" class="edge">
|
||||
<title>n20->n33</title>
|
||||
<path fill="none" stroke="blue" d="M1480.44,-395.29C1490.61,-421.36 1508.69,-474.28 1508.69,-521 1508.69,-739 1508.69,-739 1508.69,-739 1508.69,-779.45 1512.75,-794.76 1489.69,-828 1478.94,-843.5 1462.04,-855.49 1446.28,-864.11"/>
|
||||
<polygon fill="blue" stroke="blue" points="1444.48,-861.1 1437.2,-868.79 1447.69,-867.32 1444.48,-861.1"/>
|
||||
</g>
|
||||
<!-- n21->n22 -->
|
||||
<g id="edge34" class="edge">
|
||||
<title>n21->n22</title>
|
||||
<path fill="none" stroke="blue" d="M1473.69,-287.7C1473.69,-279.98 1473.69,-270.71 1473.69,-262.11"/>
|
||||
<polygon fill="blue" stroke="blue" points="1477.19,-262.1 1473.69,-252.1 1470.19,-262.1 1477.19,-262.1"/>
|
||||
</g>
|
||||
<!-- n22->n23 -->
|
||||
<g id="edge37" class="edge">
|
||||
<title>n22->n23</title>
|
||||
<path fill="none" stroke="blue" d="M1403.07,-230.58C1205.26,-223.59 653.06,-202.55 534.86,-179.37"/>
|
||||
<polygon fill="blue" stroke="blue" points="535.33,-175.89 524.81,-177.13 533.8,-182.72 535.33,-175.89"/>
|
||||
</g>
|
||||
<!-- n24 -->
|
||||
<g id="node37" class="node">
|
||||
<title>n24</title>
|
||||
<polygon fill="lightcoral" stroke="black" points="543.69,-108 451.69,-108 451.69,-72 543.69,-72 543.69,-108"/>
|
||||
<text text-anchor="middle" x="497.69" y="-86.3" font-family="Times,serif" font-size="14.00">24: IF_TRUE</text>
|
||||
</g>
|
||||
<!-- n23->n24 -->
|
||||
<g id="edge38" class="edge">
|
||||
<title>n23->n24</title>
|
||||
<path fill="none" stroke="red" stroke-width="2" d="M497.69,-143.7C497.69,-135.98 497.69,-126.71 497.69,-118.11"/>
|
||||
<polygon fill="red" stroke="red" stroke-width="2" points="501.19,-118.1 497.69,-108.1 494.19,-118.1 501.19,-118.1"/>
|
||||
</g>
|
||||
<!-- n26 -->
|
||||
<g id="node39" class="node">
|
||||
<title>n26</title>
|
||||
<polygon fill="lightcoral" stroke="black" points="433.69,-108 335.69,-108 335.69,-72 433.69,-72 433.69,-108"/>
|
||||
<text text-anchor="middle" x="384.69" y="-86.3" font-family="Times,serif" font-size="14.00">26: IF_FALSE</text>
|
||||
</g>
|
||||
<!-- n23->n26 -->
|
||||
<g id="edge41" class="edge">
|
||||
<title>n23->n26</title>
|
||||
<path fill="none" stroke="red" stroke-width="2" d="M470.63,-144.23C455.75,-135.02 437.1,-123.47 420.98,-113.48"/>
|
||||
<polygon fill="red" stroke="red" stroke-width="2" points="422.67,-110.41 412.32,-108.12 418.98,-116.36 422.67,-110.41"/>
|
||||
</g>
|
||||
<!-- n24->n25 -->
|
||||
<g id="edge39" class="edge">
|
||||
<title>n24->n25</title>
|
||||
<path fill="none" stroke="red" stroke-width="2" d="M483.11,-71.7C476.04,-63.3 467.41,-53.07 459.65,-43.86"/>
|
||||
<polygon fill="red" stroke="red" stroke-width="2" points="462.23,-41.49 453.11,-36.1 456.88,-46.01 462.23,-41.49"/>
|
||||
</g>
|
||||
<!-- n28 -->
|
||||
<g id="node41" class="node">
|
||||
<title>n28</title>
|
||||
<polygon fill="lightcoral" stroke="black" points="406.69,-468 352.69,-468 352.69,-432 406.69,-432 406.69,-468"/>
|
||||
<text text-anchor="middle" x="379.69" y="-446.3" font-family="Times,serif" font-size="14.00">28: IF</text>
|
||||
</g>
|
||||
<!-- n26->n28 -->
|
||||
<g id="edge44" class="edge">
|
||||
<title>n26->n28</title>
|
||||
<path fill="none" stroke="red" stroke-width="2" d="M383.71,-108.04C382.25,-134.69 379.69,-187.86 379.69,-233 379.69,-307 379.69,-307 379.69,-307 379.69,-347 379.69,-393.35 379.69,-421.92"/>
|
||||
<polygon fill="red" stroke="red" stroke-width="2" points="376.19,-421.95 379.69,-431.95 383.19,-421.95 376.19,-421.95"/>
|
||||
</g>
|
||||
<!-- n27->n28 -->
|
||||
<g id="edge45" class="edge">
|
||||
<title>n27->n28</title>
|
||||
<path fill="none" stroke="blue" d="M395.82,-504.76C393.43,-496.78 390.48,-486.95 387.76,-477.89"/>
|
||||
<polygon fill="blue" stroke="blue" points="391.06,-476.7 384.83,-468.12 384.35,-478.71 391.06,-476.7"/>
|
||||
</g>
|
||||
<!-- n29 -->
|
||||
<g id="node42" class="node">
|
||||
<title>n29</title>
|
||||
<polygon fill="lightcoral" stroke="black" points="351.69,-252 259.69,-252 259.69,-216 351.69,-216 351.69,-252"/>
|
||||
<text text-anchor="middle" x="305.69" y="-230.3" font-family="Times,serif" font-size="14.00">29: IF_TRUE</text>
|
||||
</g>
|
||||
<!-- n28->n29 -->
|
||||
<g id="edge46" class="edge">
|
||||
<title>n28->n29</title>
|
||||
<path fill="none" stroke="red" stroke-width="2" d="M373.76,-431.85C360.91,-394.68 330.4,-306.44 314.97,-261.82"/>
|
||||
<polygon fill="red" stroke="red" stroke-width="2" points="318.23,-260.54 311.65,-252.23 311.61,-262.83 318.23,-260.54"/>
|
||||
</g>
|
||||
<!-- n31 -->
|
||||
<g id="node43" class="node">
|
||||
<title>n31</title>
|
||||
<polygon fill="lightcoral" stroke="black" points="507.69,-396 409.69,-396 409.69,-360 507.69,-360 507.69,-396"/>
|
||||
<text text-anchor="middle" x="458.69" y="-374.3" font-family="Times,serif" font-size="14.00">31: IF_FALSE</text>
|
||||
</g>
|
||||
<!-- n28->n31 -->
|
||||
<g id="edge50" class="edge">
|
||||
<title>n28->n31</title>
|
||||
<path fill="none" stroke="red" stroke-width="2" d="M399.22,-431.7C409.08,-422.97 421.18,-412.24 431.89,-402.75"/>
|
||||
<polygon fill="red" stroke="red" stroke-width="2" points="434.23,-405.36 439.39,-396.1 429.59,-400.12 434.23,-405.36"/>
|
||||
</g>
|
||||
<!-- n29->n30 -->
|
||||
<g id="edge47" class="edge">
|
||||
<title>n29->n30</title>
|
||||
<path fill="none" stroke="red" stroke-width="2" d="M302.81,-215.85C296.57,-178.75 281.77,-90.81 274.25,-46.1"/>
|
||||
<polygon fill="red" stroke="red" stroke-width="2" points="277.7,-45.51 272.59,-36.23 270.8,-46.67 277.7,-45.51"/>
|
||||
</g>
|
||||
<!-- n31->n37 -->
|
||||
<g id="edge61" class="edge">
|
||||
<title>n31->n37</title>
|
||||
<path fill="none" stroke="red" stroke-width="2" d="M459.44,-359.7C459.77,-351.98 460.16,-342.71 460.53,-334.11"/>
|
||||
<polygon fill="red" stroke="red" stroke-width="2" points="464.03,-334.25 460.96,-324.1 457.04,-333.95 464.03,-334.25"/>
|
||||
</g>
|
||||
<!-- n35 -->
|
||||
<g id="node46" class="node">
|
||||
<title>n35</title>
|
||||
<polygon fill="deepskyblue" stroke="black" points="1365.69,-612 1250.9,-594 1365.69,-576 1480.48,-594 1365.69,-612"/>
|
||||
<text text-anchor="middle" x="1365.69" y="-590.3" font-family="Times,serif" font-size="14.00">35: ADD DOUBLE</text>
|
||||
</g>
|
||||
<!-- n32->n35 -->
|
||||
<g id="edge57" class="edge">
|
||||
<title>n32->n35</title>
|
||||
<path fill="none" stroke="blue" d="M1345.42,-648.05C1346.79,-639.73 1349.35,-629.54 1352.31,-620.32"/>
|
||||
<polygon fill="blue" stroke="blue" points="1355.63,-621.42 1355.64,-610.83 1349.02,-619.1 1355.63,-621.42"/>
|
||||
</g>
|
||||
<!-- n32->n35 -->
|
||||
<g id="edge58" class="edge">
|
||||
<title>n32->n35</title>
|
||||
<path fill="none" stroke="blue" d="M1356.63,-649.46C1359.78,-641.39 1362.81,-631.28 1364.96,-621.98"/>
|
||||
<polygon fill="blue" stroke="blue" points="1368.44,-622.45 1366.97,-611.96 1361.57,-621.08 1368.44,-622.45"/>
|
||||
</g>
|
||||
<!-- n33->n34 -->
|
||||
<g id="edge55" class="edge">
|
||||
<title>n33->n34</title>
|
||||
<path fill="none" stroke="blue" d="M1366.45,-870.37C1319.75,-858.03 1242.71,-837.68 1192.08,-824.31"/>
|
||||
<polygon fill="blue" stroke="blue" points="1192.88,-820.9 1182.32,-821.73 1191.1,-827.67 1192.88,-820.9"/>
|
||||
</g>
|
||||
<!-- n35->n36 -->
|
||||
<g id="edge59" class="edge">
|
||||
<title>n35->n36</title>
|
||||
<path fill="none" stroke="blue" d="M1365.69,-575.7C1365.69,-567.98 1365.69,-558.71 1365.69,-550.11"/>
|
||||
<polygon fill="blue" stroke="blue" points="1369.19,-550.1 1365.69,-540.1 1362.19,-550.1 1369.19,-550.1"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 34 KiB |
Loading…
x
Reference in New Issue
Block a user