aboutsummaryrefslogtreecommitdiff
path: root/sys/qpoe/qpex.h
blob: 45cc3db062d25e3eda56d2266a1296e2c77b3175 (plain) (blame)
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# QPEX.H -- QPOE expression evaluator definitions.

# Size limiting definitions.
define	DEF_PROGBUFLEN		65536	# default program buffer length, ints
define	DEF_DATABUFLEN		65536	# default data buffer length, chars
define	DEF_SZEXPRBUF		2048	# default size expression buffer
define	INC_SZEXPRBUF		2048	# increment if overflow
define	DEF_XLEN		256	# default (initial) range buffer size
define	MAX_INSTRUCTIONS	ARB	# arbitrary do-loop index
define	MAX_LEVELS		32	# max levels of program nesting
define	DEF_MAXRRLUTLEN		1024	# max RRLUT (reduced resolution) length
define	DEF_MAXFRLUTLEN		8192	# max FRLUT (full resolution) length
define	DEF_LUTMINRANGES	5	# use RRLUT if more ranges than this
define	DEF_LUTSCALE		15	# multiplied by nranges to get rrlutlen

# Magic values used to represent open ranges :N and N:.
define	LEFTI		-MAX_INT
define	RIGHTI		 MAX_INT
define	LEFTR		-MAX_REAL
define	RIGHTR		 MAX_REAL
define	LEFTD		-MAX_DOUBLE
define	RIGHTD		 MAX_DOUBLE

define	IS_LEFTI	(($1) == -MAX_INT)
define	IS_RIGHTI	(($1) ==  MAX_INT)
define	IS_LEFTR	(($1) <= -MAX_REAL)
define	IS_RIGHTR	(($1) >=  MAX_REAL)
define	IS_LEFTD	(($1) <= -MAX_DOUBLE)
define	IS_RIGHTD	(($1) >=  MAX_DOUBLE)

# The compiled expression descriptor.  The program buffer holds the compiled
# expression to be interpreted to test each data event structure.  The data
# buffer is used to store program data, e.g., lookup table descriptors,
# TY_DOUBLE constants (these are too large to be stored directly in the
# compiled program), and the textual expressions compiled to generate the
# program; the latter are used by QPEX_GETFILTER to regenerate the current
# expression.  The expression terms (ET) and lookup table (LT) descriptors
# are maintained on linked lists.  New ET descriptors are linked onto the
# tail of the ET list; LT descriptors are linked onto the head of the LT list.
# The program and data buffers are *nonrelocatable* (hence fixed in size)
# to allow use of absolute pointers to reference structures within the buffers.

define	LEN_EXDES	16
define	EX_QP		Memi[$1]	# back pointer to QPOE descriptor
define	EX_DEBUG	Memi[$1+1]	# debug level
define	EX_START	Memi[$1+2]	# pointer to first instruction
define	EX_PB		Memi[$1+3]	# pointer to program buffer (int)
define	EX_PBTOP	Memi[$1+4]	# pointer to top+1 of pb
define	EX_PBOP		Memi[$1+5]	# pointer to next avail. cell in pb
define	EX_DB		Memi[$1+6]	# data buffer pointer (char)
define	EX_DBTOP	Memi[$1+7]	# pointer to top+1 of db
define	EX_DBOP		Memi[$1+8]	# pointer to next avail. cell in db
define	EX_MAXFRLUTLEN	Memi[$1+9]	# max full-res lut length
define	EX_MAXRRLUTLEN	Memi[$1+10]	# max reduced-res lut length
define	EX_LUTMINRANGES	Memi[$1+11]	# min ranges required for a LUT
define	EX_LUTSCALE	Memi[$1+12]	# scale nranges to frlutlen
define	EX_ETHEAD	Memi[$1+13]	# offset of first expr term descriptor
define	EX_ETTAIL	Memi[$1+14]	# offset of last expr term descriptor
define	EX_LTHEAD	Memi[$1+15]	# offset of first LUT descriptor

# Expression terms descriptor.  Stored in the data buffer and maintained
# as a linked list.

define	LEN_ETDES	9
define	ET_ATTTYPE	Memi[$1]	# datatype of attribute
define	ET_ATTOFF	Memi[$1+1]	# *typed* offset of attribute
define	ET_PROGPTR	Memi[$1+2]	# pointer to program segment 
define	ET_NINSTR	Memi[$1+3]	# program segment size, instructions
define	ET_DELETED	Memi[$1+4]	# set if term is deleted
define	ET_ATNAME	Memi[$1+5]	# attribute name used in expr
define	ET_ASSIGNOP	Memi[$1+6]	# type of assignment ("=", "+=")
define	ET_EXPRTEXT	Memi[$1+7]	# saved expr text
define	ET_NEXT		Memi[$1+8]	# databuf offset of next ET struct

# Lookup table descriptor.  Stored in the data buffer and maintained as a
# linked list.  The table itself is separately allocated.

define	LEN_LTDES	10
define	LT_NEXT		Memi[$1]	# pointer to next stored LUT
define	LT_TYPE		Memi[$1+1]	# TY_SHORT pointer to stored LUT
define	LT_LUTP		Memi[$1+2]	# TY_SHORT pointer to stored LUT
define	LT_NBINS	Memi[$1+3]	# number of lookup table entries
define	LT_LEFT		Memi[$1+4]	# lut value if index off left end
define	LT_RIGHT	Memi[$1+5]	# lut value if index off right end
define	LT_I0		Memr[P2R($1+6)]	# zero point for integer LUT
define	LT_IS		Memr[P2R($1+8)]	# scale factor for integer LUT
define	LT_R0		Memr[P2R($1+6)]	# zero point for real LUT
define	LT_RS		Memr[P2R($1+8)]	# scale factor for real LUT
define	LT_D0		Memd[P2D($1+6)]	# zero point for double LUT
define	LT_DS		Memd[P2D($1+8)]	# scale factor for double LUT

define	LT_LUT		Mems[LT_LUTP($1)+$2-1]		# LT_LUT(lt,i)

# Macros for referencing the fields of an instruction.  TY_DOUBLE arguments
# are stored in the data buffer, storing an offset in the instruction field.

define	LEN_INSTRUCTION		4	# instruction length, ints

define	OPCODE		Memi[$1]	# instruction opcode.
define	IARG1		Memi[$1+1]	# first integer argument
define	IARG2		Memi[$1+2]	# second integer argument
define	IARG3		Memi[$1+3]	# third integer argument
define	RARG1		Memr[P2R($1+1)]	# first real argument
define	RARG2		Memr[P2R($1+2)]	# second real argument
define	RARG3		Memr[P2R($1+3)]	# third real argument
define	DARG1		Memd[IARG1($1)]	# first double argument
define	DARG2		Memd[IARG2($1)]	# second double argument
define	DARG3		Memd[IARG3($1)]	# third double argument

# Instruction opcodes.

define	PASS		00		# set pass=true and return
define	RET		01		# return from subprogram
define	NOP		02		# no-operation
define	GOTO		03		# goto offset
define	XIFT		04		# exit if expr-value true
define	XIFF		05		# exit if expr-value false
define	LDSI		06		# load short to int
define	LDII		07		# load int
define	LDRR		08		# load real
define	LDRD		09		# load real to double
define	LDDD		10		# load double

define	BTTI		11		# bit test, int
define	EQLI		12		# test if equal
define	EQLR		13
define	EQLD		14
define	LEQI		15		# test if less than or equal
define	LEQR		16
define	LEQD		17
define	GEQI		18		# test if greater than or equal
define	GEQR		19
define	GEQD		20
define	RNGI		21		# range test
define	RNGR		22
define	RNGD		23

define	BTTXS		24		# bit test direct and exit if false
define	BTTXI		25
define	NEQXS		26		# not equals test and exit
define	NEQXI		27
define	NEQXR		28
define	NEQXD		29
define	EQLXS		30		# equality test direct and exit if false
define	EQLXI		31
define	EQLXR		32
define	EQLXD		33
define	LEQXS		34		# LEQ test direct and exit if false
define	LEQXI		35
define	LEQXR		36
define	LEQXD		37
define	GEQXS		38		# GEQ test direct and exit if false
define	GEQXI		39
define	GEQXR		40
define	GEQXD		41
define	RNGXS		42		# range test direct and exit if false
define	RNGXI		43
define	RNGXR		44
define	RNGXD		45

define	LUTXS		46		# lookup table test
define	LUTXI		47
define	LUTXR		48
define	LUTXD		49