-
Notifications
You must be signed in to change notification settings - Fork 8
/
zs_scaling.gsl
84 lines (78 loc) · 2.59 KB
/
zs_scaling.gsl
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
.output "$(class.name).h"
/* =========================================================================
$(class.name) - scaling atomics
** WARNING *************************************************************
THIS SOURCE FILE IS 100% GENERATED. If you edit this file, you will lose
your changes at the next build cycle. This is great for temporary printf
statements. DO NOT MAKE ANY CHANGES YOU WISH TO KEEP. The correct places
for commits are:
* The XML model used for this code generation: $(filename), or
* The code generation script that built this file: $(script)
************************************************************************
. for class.license
$(string.trim (license.):block )
. endfor
=========================================================================
*/
#ifndef $(CLASS.NAME)_H_INCLUDED
#define $(CLASS.NAME)_H_INCLUDED
#ifndef S_APPLY_SCALE_DEFINED
#define S_APPLY_SCALE_DEFINED
// Applies a scale up to a pipe register
static void
s_scale_up (zs_pipe_t *input, zs_pipe_t *output, int64_t scale)
{
if (zs_pipe_type (input) == 'w')
zs_pipe_send_whole (output, zs_pipe_whole (input) * scale);
else
if (zs_pipe_type (input) == 'r')
zs_pipe_send_real (output, zs_pipe_real (input) * (double) scale);
else {
// String could be real or whole
if ((double) zs_pipe_whole (input) == zs_pipe_real (input))
zs_pipe_send_whole (output, zs_pipe_whole (input) * scale);
else
zs_pipe_send_real (output, zs_pipe_real (input) * scale);
}
}
#endif
.for class.atomic
. atomic.scale ?= "up"
. if atomic.scale = "up"
. atomic.type ?= "whole"
. atomic.op = "*"
. else
. atomic.type = "real"
. atomic.op = "/"
. endif
static int
s_$(name:c,no) (zs_vm_t *self, zs_pipe_t *input, zs_pipe_t *output)
{
if (zs_vm_probing (self)) {
zs_vm_register (self, "$(atomic.name:)", zs_type_modest, "Scale by $(string.trim (atomic.?''):left)");
. for alias
zs_vm_register (self, "$(alias.name:)", zs_type_modest, NULL);
. endfor
}
else {
// Process all values on input pipe
while (zs_pipe_recv (input)) {
. if type = "real"
// Always coerce to a real value
zs_pipe_send_real (output, zs_pipe_real (input) $(op) ($(value:)));
. else
s_scale_up (input, output, (int64_t) ($(value:)));
. endif
}
}
return 0;
}
.endfor
static void
s_register_$(class.name) (zs_vm_t *self)
{
.for class.atomic
zs_vm_probe (self, s_$(name:c,no));
.endfor
}
#endif