eFEX firmware  1.7.3
ATLAS l1-calo - electron and tau feature extraction firmware for eFEX boards

Back to eFEX documentation
DataTypes.vhd
1 library IEEE;
2 use IEEE.STD_LOGIC_1164.all;
3 use IEEE.NUMERIC_STD.all;
4 use work.AlgoDataTypes.all;
5 
6 package DataTypes is
7 -------------------------------------------------------------------------------
8 -- USEFUL TYPES
9 -------------------------------------------------------------------------------
10  type array_std_logic_vector is array (natural range <>) of std_logic_vector;
11 
12 -------------------------------------------------------------------------------
13 -- INTERNAL DATA
14 -------------------------------------------------------------------------------
15  constant DATA_WIDTH : integer := 16;
16  constant ENERGY_WIDTH : integer := 16;
17  constant BDT_SCORE_WIDTH : integer := 11;
18  constant BDT_N_VARIABLES : integer := 11; -- Assumption: CORE is first variable and the rest are BDT_N_VARIABLES-1 symmetric variables
19  constant TOB_ENERGY_WIDTH : integer := 12;
20  constant COMPARE_BITS : integer := 16;
21  constant ENERGY_OF : std_logic_vector(ENERGY_WIDTH-1 downto 0) := (others => '1');
22  constant ENERGY_ZERO : std_logic_vector(ENERGY_WIDTH-1 downto 0) := (others => '0');
23 
24  constant PAR_WIDTH : integer := 8;
25  constant REG_WIDTH : integer := 32;
26 
27 -- Adjust the following according to the IP multiplier:
28 -- maximum value: PAR_WIDTH+DATA_WIDTH;
29  constant MULTIPLIER_OUTPUT_WIDTH : integer := PAR_WIDTH+DATA_WIDTH;
30 -- maximum value: DATA_WIDTH;
31  constant MULTIPLIER_DATA_INPUT_WIDTH : integer := DATA_WIDTH;
32 -- maximum value: PAR_WIDTH;
33  constant MULTIPLIER_PAR_INPUT_WIDTH : integer := PAR_WIDTH;
34 
35 
36  constant PARAMETER_RAM_ADDR_WIDTH : integer := 6;
37  constant PARAMETER_RAM_DATA_WIDTH : integer := 256; --must be 2^ the previous one
38  constant PARAMETER_RAM_CLOCK_OFFSET : integer := 2;
39 
40  subtype DataWord is std_logic_vector(DATA_WIDTH-1 downto 0);
41  type DataWords is array(natural range <>) of DataWord;
42  subtype DataWordWithCarry is std_logic_vector(DATA_WIDTH downto 0);
43  type DataWordsWithCarry is array(natural range <>) of DataWordWithCarry;
44  constant ZERO_DATA_WORD : DataWord := (others => '0');
45  constant ZERO_DATA_WORD_WITH_CARRY : DataWordWithCarry := (others => '0');
46  constant MAX_DATA_WORD: DataWord := (others => '1'); --TODO
47 
48  type TriggerTower is record
49  Layer0 : DataWords(LAYER0-1 downto 0);
50  Layer1 : DataWords(LAYER1-1 downto 0);
51  Layer2 : DataWords(LAYER2-1 downto 0);
52  Layer3 : DataWords(LAYER3-1 downto 0);
53  Hadron : DataWords(HADRON-1 downto 0);
54  end record;
55 
56  constant ZERO_TRIGGER_TOWER : TriggerTower := (Layer0 => ((others => (others => '0'))),
57  Layer1 => ((others => (others => '0'))),
58  Layer2 => ((others => (others => '0'))),
59  Layer3 => ((others => (others => '0'))),
60  Hadron => ((others => (others => '0'))));
61 
62  type TriggerTowers is array(natural range <>) of TriggerTower;
63  type TriggerTowersArray is array(natural range <>) of TriggerTowers;
64 
65 -------------------------------------------------------------------------------
66 -- EFEX MODULE POSITION
67 -------------------------------------------------------------------------------
68  constant EM_POSITION_ETA_ON_EDGE : integer := 0;
69  constant EM_POSITION_ETA_ON_LEFT_EDGE : integer := 1;
70  constant EM_POSITION_POSITIVE_ETA_LEFT : integer := 2;
71  constant EM_POSITION_POSITIVE_ETA_CENTRE : integer := 3;
72  constant EM_POSITION_POSITIVE_ETA_RIGHT : integer := 4;
73  constant HADRONIC_POSITION_BIT_START : integer := 5;
74  constant HADRONIC_POSITION_BIT_END : integer := 7;
75 
76 -------------------------------------------------------------------------------
77 -- Trigger Object
78 -------------------------------------------------------------------------------
79  constant RETA_WIDTH : integer := 2;
80  constant WS_WIDTH : integer := 2;
81  constant HAD_WIDTH : integer := 2;
82 
83  constant JET_OR_BDT_WIDTH : integer := 2;
84  constant FRAC_WIDTH : integer := 2;
85 
86  type TriggerObjectCore_eg is record
87  LocalMax : std_logic;
88  Max : std_logic;
89  Energy : std_logic_vector(ENERGY_WIDTH - 1 downto 0);
90  EnergyOF : std_logic;
91  REta : std_logic_vector(RETA_WIDTH - 1 downto 0);
92  ws : std_logic_vector(WS_WIDTH - 1 downto 0);
93  Had : std_logic_vector(HAD_WIDTH - 1 downto 0);
94  UpNotDown : std_logic;
95  Seed : std_logic_vector(1 downto 0);
96  Version : std_logic_vector(1 downto 0);
97  end record;
98 
99  type TriggerObjectCore_tau is record
100  IsMax : std_logic;
101  Energy : std_logic_vector(ENERGY_WIDTH - 1 downto 0);
102  EnergyOF : std_logic;
103  JetOrBDT : std_logic_vector(JET_OR_BDT_WIDTH - 1 downto 0);
104  Frac : std_logic_vector(FRAC_WIDTH - 1 downto 0);
105  UpNotDown : std_logic;
106  Seed : std_logic_vector(1 downto 0);
107  BDT : std_logic_vector(BDT_SCORE_WIDTH - 1 downto 0);
108  Version : std_logic_vector(1 downto 0);
109  end record;
110 
111  type TriggerObjectPosition is record
112  Eta : std_logic_vector(2 downto 0); -- 0 to 4 column left to right
113  Phi : std_logic_vector(2 downto 0); -- 0 to 7 row bottom up
114  end record;
115 
116  type TriggerObject_eg is record
117  Core : TriggerObjectCore_eg;
118  Position : TriggerObjectPosition;
119  end record;
120 
121  type TriggerObject_tau is record
122  Core : TriggerObjectCore_tau;
123  Position : TriggerObjectPosition;
124  end record;
125 
126  constant ZERO_TRIGGER_OBJECT_EG : TriggerObject_eg := (
127  Core => (
128  LocalMax => '0',
129  Max => '0',
130  Energy => (others => '0'),
131  EnergyOF => '0',
132  REta => (others => '0'),
133  ws => (others => '0'),
134  Had => (others => '0'),
135  UpNotDown => '0',
136  Seed => (others => '0'),
137  Version => (others => '0')),
138 
139  Position => (
140  Eta => (others => '0'),
141  Phi => (others => '0'))
142  );
143 
144  constant ZERO_TRIGGER_OBJECT_TAU : TriggerObject_tau := (
145  Core => (
146  IsMax => '0',
147  Energy => (others => '0'),
148  EnergyOF => '0',
149  JetOrBDT => (others => '0'),
150  Frac => (others => '0'),
151  UpNotDown => '0',
152  Seed => (others => '0'),
153  BDT => (others => '0'),
154  Version => (others => '0')),
155  Position => (
156  Eta => (others => '0'),
157  Phi => (others => '0'))
158  );
159 
160 
161  type TriggerObjects_eg is array(natural range <>) of TriggerObject_eg;
162  type TriggerObjects_tau is array(natural range <>) of TriggerObject_tau;
163 
164  subtype AlgoParameter is std_logic_vector(PAR_WIDTH-1 downto 0);
165  type AlgoParameters is array(natural range <>) of AlgoParameter;
166 
167  subtype AlgoRegister is std_logic_vector(REG_WIDTH-1 downto 0);
168  type AlgoRegisters is array(natural range <>) of AlgoRegister;
169 
170  subtype TriggerTowerMatrix is TriggerTowersArray(INPUT_COLUMNS-1 downto 0)(INPUT_ROWS-1 downto 0);
171 
172 -------------------------------------------------------------------------------
173 -- FUNCTIONS
174 -------------------------------------------------------------------------------
175 
176  function TOBEnergy (X : AlgoTriggerObject) return std_logic_vector;
177 
178  function to_AlgoTriggerObject (X : TriggerObject_eg; FPGA : integer) return AlgoTriggerObject;
179  function to_AlgoTriggerObject (X : TriggerObject_tau; FPGA : integer) return AlgoTriggerObject;
180 
181  function to_AlgoXTriggerObject (X : TriggerObject_eg; FPGA : integer) return AlgoXTriggerObject;
182  function to_AlgoXTriggerObject (X : TriggerObject_tau; FPGA : integer) return AlgoXTriggerObject;
183 
184 
185  function to_TriggerObject_eg (X : AlgoTriggerObject) return TriggerObject_eg;
186  function to_TriggerObject_tau (X : AlgoTriggerObject) return TriggerObject_tau;
187 
188 
189  function to_TriggerObjects_eg (X : AlgoOutput) return TriggerObjects_eg;
190  function to_TriggerObjects_tau (X : AlgoOutput) return TriggerObjects_tau;
191 
192  function to_AlgoOutput (X : TriggerObjects_eg; FPGA : integer) return AlgoOutput;
193  function to_AlgoOutput (X : TriggerObjects_tau; FPGA : integer) return AlgoOutput;
194 
195  function to_AlgoOutput (X : AlgoTriggerObjects) return AlgoOutput;
196 
197  function to_AlgoXOutput (X : TriggerObjects_eg; FPGA : integer) return AlgoXOutput;
198  function to_AlgoXOutput (X : TriggerObjects_tau; FPGA : integer) return AlgoXOutput;
199 
200 
201  function is_valid_core (X : TriggerObjectCore_eg) return std_logic;
202  function is_valid_core (X : TriggerObjectCore_tau) return std_logic;
203 
204  function is_valid_TOB (X : AlgoTriggerObject) return std_logic;
205 
206  function validate_core (X : TriggerObjectCore_eg) return TriggerObjectCore_eg;
207  function validate_core (X : TriggerObjectCore_tau) return TriggerObjectCore_tau;
208 
209  function invalidate_core (X : TriggerObjectCore_eg) return TriggerObjectCore_eg;
210  function invalidate_core (X : TriggerObjectCore_tau) return TriggerObjectCore_tau;
211 
212  function invalidate_TOB (X : AlgoTriggerObject) return AlgoTriggerObject;
213 
214  function to_TOBEnergy (X : DataWord) return std_logic_vector;
215  function FPGA_to_processor_number (X : integer) return std_logic_vector;
216 
217  function BitLeftShift(A : DataWord; B : integer) return DataWord;
218 
219  function EvaluateCondition (
220  Pass_overflow : std_logic;
221  Fail_overflow : std_logic;
222  E_threshold : DataWord;
223  Total_Energy : DataWord;
224  Total_Energy_of : std_logic;
225  Condition_Energy : DataWord;
226  Thresholds : DataWords(2 downto 0);
227  Thresholds_overflows : std_logic_vector(2 downto 0))
228  return std_logic_vector;
229 
230 function to_SuperCellArray (X : TriggerTowers) return DataWords;
231 
232 end package;
233 
234 package body DataTypes is
235 
236  function TOBEnergy (X : AlgoTriggerObject) return std_logic_vector is
237  variable Y : std_logic_vector(11 downto 0);
238  begin
239  Y := X(11 downto 0);
240  return Y;
241  end;
242 
243  function is_valid_core (X : TriggerObjectCore_eg) return std_logic is
244  variable Y : std_logic;
245  begin
246  if X.LocalMax = '1' then
247  Y := '1';
248  else
249  Y := '0';
250  end if;
251  return Y;
252  end;
253 
254  function is_valid_core (X : TriggerObjectCore_tau) return std_logic is
255  variable Y : std_logic;
256  begin
257  if X.IsMax = '1' then
258  Y := '1';
259  else
260  Y := '0';
261  end if;
262  return Y;
263  end;
264 
265 
266  function is_valid_TOB (X : AlgoTriggerObject) return std_logic is
267  variable Y : std_logic;
268  begin
269  if X(11 downto 0) = x"000" then
270  Y := '0';
271  else
272  Y := '1';
273  end if;
274  return Y;
275  end;
276 
277  function validate_core (X : TriggerObjectCore_eg) return TriggerObjectCore_eg is
278  variable Y : TriggerObjectCore_eg;
279  begin
280  Y := X;
281  if is_valid_core(X) = '0' then
282  Y.Energy := (others => '0');
283  Y.EnergyOF := '0';
284  end if;
285  return Y;
286  end;
287 
288  function invalidate_core (X : TriggerObjectCore_tau) return TriggerObjectCore_tau is
289  variable Y : TriggerObjectCore_tau;
290  begin
291  Y := X;
292  Y.Energy := (others => '0');
293  Y.IsMax := '0';
294  Y.EnergyOF := '0';
295  return Y;
296  end;
297 
298  function validate_core (X : TriggerObjectCore_tau) return TriggerObjectCore_tau is
299  variable Y : TriggerObjectCore_tau;
300  begin
301  Y := X;
302  if is_valid_core(X) = '0' then
303  Y.EnergyOF := '0';
304  Y.Energy := (others => '0');
305  end if;
306  return Y;
307  end;
308 
309  function invalidate_core (X : TriggerObjectCore_eg) return TriggerObjectCore_eg is
310  variable Y : TriggerObjectCore_eg;
311  begin
312  Y := X;
313  Y.Energy := (others => '0');
314  Y.LocalMax := '0';
315  Y.EnergyOF := '0';
316  return Y;
317  end;
318 
319  function invalidate_TOB (X : AlgoTriggerObject) return AlgoTriggerObject is
320  variable Y : AlgoTriggerObject;
321  begin
322  Y := X;
323  Y(11 downto 0) := x"000";
324  return Y;
325  end;
326 
327 
328 
329 
330 ------------------ eg TOB FORMAT definition ---------------------
331  function to_AlgoTriggerObject (X : TriggerObject_eg; FPGA : integer) return AlgoTriggerObject is
332  variable Y : AlgoTriggerObject;
333  begin
334  if X.Core.EnergyOF = '1' or X.Core.Energy(ENERGY_WIDTH-2) = '1' or X.Core.Energy(ENERGY_WIDTH-1) = '1' then
335  Y(11 downto 0) := (others => '1');
336  else
337  -- Convert energy here
338  Y(11 downto 0) := (TOB_ENERGY_WIDTH-1 downto 0 => X.Core.Energy(ENERGY_WIDTH-3 downto 2), others => '0');
339  end if;
340  Y(13 downto 12) := X.Core.Version;
341  Y(14) := X.Core.Max;
342  Y(15) := X.Core.UpNotDown;
343  Y(17 downto 16) := X.Core.Seed;
344  Y(19 downto 18) := X.Core.REta;
345  Y(21 downto 20) := X.Core.ws;
346  Y(23 downto 22) := X.Core.Had;
347  Y(26 downto 24) := X.Position.Phi;
348  Y(29 downto 27) := X.Position.Eta;
349  Y(31 downto 30) := FPGA_to_processor_number(FPGA);
350  return Y;
351  end;
352 
353 ------------------ XTOB FORMAT definition ---------------------
354  function to_AlgoXTriggerObject (X : TriggerObject_eg; FPGA : integer) return AlgoXTriggerObject is
355  variable Y : AlgoXTriggerObject;
356  begin
357  Y(11 downto 0) := (others => '0');
358  Y(13 downto 12) := X.Core.Version;
359  Y(14) := X.Core.Max;
360  Y(15) := X.Core.UpNotDown;
361  Y(17 downto 16) := X.Core.Seed;
362  Y(19 downto 18) := X.Core.REta;
363  Y(21 downto 20) := X.Core.ws;
364  Y(23 downto 22) := X.Core.Had;
365  Y(26 downto 24) := X.Position.Phi;
366  Y(29 downto 27) := X.Position.Eta;
367  Y(31 downto 30) := FPGA_to_processor_number(FPGA);
368  if X.Core.EnergyOF = '1' then
369  Y(47 downto 32) := (others => '1');
370  else
371  Y(47 downto 32) := X.Core.Energy;
372  end if;
373  Y(63 downto 48) := (others => '0');
374  return Y;
375  end;
376 
377  function to_TriggerObject_eg (X : AlgoTriggerObject) return TriggerObject_eg is
378  variable Y : TriggerObject_eg;
379  begin
380  if X(ENERGY_WIDTH-1 downto 0) /= ENERGY_ZERO then
381  Y.Core.LocalMax := '1';
382  else
383  Y.Core.LocalMax := '0';
384  end if;
385  Y.Core.Energy := "00" & X(11 downto 0) & "00";
386  Y.Core.Version := X(13 downto 12);
387  Y.Core.Max := X(14);
388  Y.Core.UpNotDown := X(15);
389  Y.Core.Seed := X(17 downto 16);
390  Y.Core.REta := X(19 downto 18);
391  Y.Core.ws := X(21 downto 20);
392  Y.Core.Had := X(23 downto 22);
393  Y.Position.Phi := X(26 downto 24);
394  Y.Position.Eta := X(29 downto 27);
395  if X(ENERGY_WIDTH-1 downto 0) = ENERGY_OF then
396  Y.Core.EnergyOF := '1';
397  else
398  Y.Core.EnergyOF := '0';
399  end if;
400 
401  return Y;
402  end;
403 
404 
405 ------------------ TAU TOB FORMAT definition ---------------------
406  function to_AlgoTriggerObject (X : TriggerObject_tau; FPGA : integer) return AlgoTriggerObject is
407  variable Y : AlgoTriggerObject;
408  begin
409  if X.Core.EnergyOF = '1' or X.Core.Energy(ENERGY_WIDTH-2) = '1' or X.Core.Energy(ENERGY_WIDTH-1) = '1' then
410  Y(11 downto 0) := (others => '1');
411  else
412  -- Convert energy here
413  Y(11 downto 0) := (TOB_ENERGY_WIDTH-1 downto 0 => X.Core.Energy(ENERGY_WIDTH-3 downto 2), others => '0');
414  end if;
415  Y(13 downto 12) := X.Core.Version;
416  Y(14) := X.Core.IsMax;
417  Y(15) := X.Core.UpNotDown;
418  Y(17 downto 16) := X.Core.Seed;
419  Y(19 downto 18) := X.Core.JetOrBDT;
420  Y(21 downto 20) := X.Core.Frac;
421  Y(23 downto 22) := "00";
422  Y(26 downto 24) := X.Position.Phi;
423  Y(29 downto 27) := X.Position.Eta;
424  Y(31 downto 30) := FPGA_to_processor_number(FPGA);
425  return Y;
426  end;
427 
428 ------------------ TAU XTOB FORMAT definition ---------------------
429  function to_AlgoXTriggerObject (X : TriggerObject_tau; FPGA : integer) return AlgoXTriggerObject is
430  variable Y : AlgoXTriggerObject;
431  begin
432  Y(BDT_SCORE_WIDTH - 1 downto 0) := X.Core.BDT;
433  Y(11) := '0';
434  Y(13 downto 12) := X.Core.Version;
435  Y(14) := X.Core.IsMax;
436  Y(15) := X.Core.UpNotDown;
437  Y(17 downto 16) := X.Core.Seed;
438  Y(19 downto 18) := X.Core.JetOrBDT;
439  Y(21 downto 20) := X.Core.Frac;
440  Y(23 downto 22) := "00";
441  Y(26 downto 24) := X.Position.Phi;
442  Y(29 downto 27) := X.Position.Eta;
443  Y(31 downto 30) := FPGA_to_processor_number(FPGA);
444  if X.Core.EnergyOF = '1' then
445  Y(47 downto 32) := (others => '1');
446  else
447  Y(47 downto 32) := X.Core.Energy;
448  end if;
449  Y(63 downto 48) := (others => '0');
450  return Y;
451  end;
452 
453  function to_TriggerObject_tau (X : AlgoTriggerObject) return TriggerObject_tau is
454  variable Y : TriggerObject_tau;
455  begin
456  if X(ENERGY_WIDTH-1 downto 0) /= ENERGY_ZERO then
457  Y.Core.IsMax := '1';
458  else
459  Y.Core.IsMax := '0';
460  end if;
461  Y.Core.Energy := "00" & X(11 downto 0) & "00";
462  Y.Core.Version := X(13 downto 12);
463  Y.Core.UpNotDown := X(15);
464  Y.Core.Seed := X(17 downto 16);
465  Y.Core.JetOrBDT := X(19 downto 18);
466  Y.Position.Phi := X(26 downto 24);
467  Y.Position.Eta := X(29 downto 27);
468  if X(ENERGY_WIDTH-1 downto 0) = ENERGY_OF then
469  Y.Core.EnergyOF := '1';
470  else
471  Y.Core.EnergyOF := '0';
472  end if;
473 
474  return Y;
475  end;
476 
477 -------------------------------------------
478 
479  function to_TriggerObjects_eg (X : AlgoOutput) return TriggerObjects_eg is
480  variable Y : TriggerObjects_eg(7 downto 0);
481  begin
482  for i in Y'range loop
483  Y(i) := to_TriggerObject_eg(X(i));
484  end loop; -- i
485  return Y;
486  end;
487 
488  function to_AlgoOutput (X : TriggerObjects_eg; FPGA : integer) return AlgoOutput is
489  variable Y : AlgoOutput;
490  begin
491  for i in Y'range loop
492  Y(i) := to_AlgoTriggerObject(X(i), FPGA);
493  end loop; -- i
494  return Y;
495  end;
496 
497  function to_TriggerObjects_tau (X : AlgoOutput) return TriggerObjects_tau is
498  variable Y : TriggerObjects_tau(7 downto 0);
499  begin
500  for i in Y'range loop
501  Y(i) := to_TriggerObject_tau(X(i));
502  end loop; -- i
503  return Y;
504  end;
505 
506  function to_AlgoOutput (X : TriggerObjects_tau; FPGA : integer) return AlgoOutput is
507  variable Y : AlgoOutput;
508  begin
509  for i in Y'range loop
510  Y(i) := to_AlgoTriggerObject(X(i), FPGA);
511  end loop; -- i
512  return Y;
513  end;
514 
515 
516  function to_AlgoOutput (X : AlgoTriggerObjects) return AlgoOutput is
517  variable Y : AlgoOutput;
518  begin
519  for i in Y'range loop
520  Y(i) := X(i);
521  end loop; -- i
522  return Y;
523  end;
524 
525  function to_AlgoXOutput (X : TriggerObjects_eg; FPGA : integer) return AlgoXOutput is
526  variable Y : AlgoXOutput;
527  begin
528  for i in Y'range loop
529  Y(i) := to_AlgoXTriggerObject(X(i), FPGA);
530  end loop; -- i
531  return Y;
532  end;
533 
534 
535  function to_AlgoXOutput (X : TriggerObjects_tau; FPGA : integer) return AlgoXOutput is
536  variable Y : AlgoXOutput;
537  begin
538  for i in Y'range loop
539  Y(i) := to_AlgoXTriggerObject(X(i), FPGA);
540  end loop; -- i
541  return Y;
542  end;
543 
544  function to_TOBEnergy (X : DataWord) return std_logic_vector is
545  variable Y : std_logic_vector(ENERGY_WIDTH - 1 downto 0);
546  begin
547  if (ENERGY_WIDTH - 1) /= DataWord'high then
548  if unsigned(X(X'high downto ENERGY_WIDTH)) /= 0 then
549  Y := (others => '1');
550  else
551  Y := X(ENERGY_WIDTH-1 downto 0);
552  end if;
553  else
554  Y := X;
555  end if;
556 
557  return Y;
558  end;
559 
560  function FPGA_to_processor_number (X : integer) return std_logic_vector is
561  variable Y : std_logic_vector(1 downto 0);
562  begin
563  case X is
564  when 1 =>
565  Y := "00";
566  when 2 =>
567  Y := "11";
568  when 3 =>
569  Y := "01";
570  when 4 =>
571  Y := "10";
572  when others =>
573  Y := "00";
574  end case;
575 
576  return Y;
577  end function;
578 
580  function BitLeftShift (
581  A : DataWord;
582  B : integer)
583  return DataWord is
584 
585  variable Y : DataWord;
586  variable AllOne : DataWord := (others => '1');
587  begin
588  Y := (Y'high downto B => A(A'high - B downto 0), others => '0');
589 
590  if unsigned(A(A'high downto A'high -B+1)) = 0 then
591  return Y;
592  else
593  return AllOne;
594  end if;
595  end function BitLeftShift;
596 
597  function EvaluateCondition (
598  Pass_overflow : std_logic;
599  Fail_overflow : std_logic;
600  E_threshold : DataWord;
601  Total_Energy : DataWord;
602  Total_Energy_of : std_logic;
603  Condition_Energy : DataWord;
604  Thresholds : DataWords(2 downto 0);
605  Thresholds_overflows : std_logic_vector(2 downto 0))
606  return std_logic_vector is
607  variable Condition : std_logic_vector(1 downto 0);
608  begin -- function EvaluateCondition
609 
610  if Pass_overflow = '0' and Total_Energy_of = '0' and Total_Energy < E_threshold then
611 
612  if Fail_overflow = '0' then
613 
614  if (Condition_Energy < Thresholds(0) or Thresholds_overflows(0) = '1') then
615  Condition := "00";
616  elsif (Condition_Energy < Thresholds(1) or Thresholds_overflows(1) = '1') then
617  Condition := "01";
618  elsif (Condition_Energy < Thresholds(2) or Thresholds_overflows(2) = '1') then
619  Condition := "10";
620  else
621  Condition := "11";
622  end if;
623  else
624  -- Env sum overflow
625  Condition := "00";
626  end if;
627  else
628  -- Core overflow or energy threshold exceeded
629  Condition := "11";
630  end if;
631 
632 
633  return Condition;
634  end function EvaluateCondition;
635 
636 
637  function to_SuperCellArray (X : TriggerTowers) return DataWords is
638  variable Y : DataWords(98 downto 0);
639  begin
640  Y(0) := X(0).Layer0(0);
641  Y(1) := X(1).Layer0(0);
642  Y(2) := X(2).Layer0(0);
643  Y(3) := X(3).Layer0(0);
644  Y(4) := X(4).Layer0(0);
645  Y(5) := X(5).Layer0(0);
646  Y(6) := X(6).Layer0(0);
647  Y(7) := X(7).Layer0(0);
648  Y(8) := X(8).Layer0(0);
649  Y(9) := X(0).Layer1(0);
650  Y(10) := X(0).Layer1(1);
651  Y(11) := X(0).Layer1(2);
652  Y(12) := X(0).Layer1(3);
653  Y(13) := X(1).Layer1(0);
654  Y(14) := X(1).Layer1(1);
655  Y(15) := X(1).Layer1(2);
656  Y(16) := X(1).Layer1(3);
657  Y(17) := X(2).Layer1(0);
658  Y(18) := X(2).Layer1(1);
659  Y(19) := X(2).Layer1(2);
660  Y(20) := X(2).Layer1(3);
661  Y(21) := X(3).Layer1(0);
662  Y(22) := X(3).Layer1(1);
663  Y(23) := X(3).Layer1(2);
664  Y(24) := X(3).Layer1(3);
665  Y(25) := X(4).Layer1(0);
666  Y(26) := X(4).Layer1(1);
667  Y(27) := X(4).Layer1(2);
668  Y(28) := X(4).Layer1(3);
669  Y(29) := X(5).Layer1(0);
670  Y(30) := X(5).Layer1(1);
671  Y(31) := X(5).Layer1(2);
672  Y(32) := X(5).Layer1(3);
673  Y(33) := X(6).Layer1(0);
674  Y(34) := X(6).Layer1(1);
675  Y(35) := X(6).Layer1(2);
676  Y(36) := X(6).Layer1(3);
677  Y(37) := X(7).Layer1(0);
678  Y(38) := X(7).Layer1(1);
679  Y(39) := X(7).Layer1(2);
680  Y(40) := X(7).Layer1(3);
681  Y(41) := X(8).Layer1(0);
682  Y(42) := X(8).Layer1(1);
683  Y(43) := X(8).Layer1(2);
684  Y(44) := X(8).Layer1(3);
685  Y(45) := X(0).Layer2(0);
686  Y(46) := X(0).Layer2(1);
687  Y(47) := X(0).Layer2(2);
688  Y(48) := X(0).Layer2(3);
689  Y(49) := X(1).Layer2(0);
690  Y(50) := X(1).Layer2(1);
691  Y(51) := X(1).Layer2(2);
692  Y(52) := X(1).Layer2(3);
693  Y(53) := X(2).Layer2(0);
694  Y(54) := X(2).Layer2(1);
695  Y(55) := X(2).Layer2(2);
696  Y(56) := X(2).Layer2(3);
697  Y(57) := X(3).Layer2(0);
698  Y(58) := X(3).Layer2(1);
699  Y(59) := X(3).Layer2(2);
700  Y(60) := X(3).Layer2(3);
701  Y(61) := X(4).Layer2(0);
702  Y(62) := X(4).Layer2(1);
703  Y(63) := X(4).Layer2(2);
704  Y(64) := X(4).Layer2(3);
705  Y(65) := X(5).Layer2(0);
706  Y(66) := X(5).Layer2(1);
707  Y(67) := X(5).Layer2(2);
708  Y(68) := X(5).Layer2(3);
709  Y(69) := X(6).Layer2(0);
710  Y(70) := X(6).Layer2(1);
711  Y(71) := X(6).Layer2(2);
712  Y(72) := X(6).Layer2(3);
713  Y(73) := X(7).Layer2(0);
714  Y(74) := X(7).Layer2(1);
715  Y(75) := X(7).Layer2(2);
716  Y(76) := X(7).Layer2(3);
717  Y(77) := X(8).Layer2(0);
718  Y(78) := X(8).Layer2(1);
719  Y(79) := X(8).Layer2(2);
720  Y(80) := X(8).Layer2(3);
721  Y(81) := X(0).Layer3(0);
722  Y(82) := X(1).Layer3(0);
723  Y(83) := X(2).Layer3(0);
724  Y(84) := X(3).Layer3(0);
725  Y(85) := X(4).Layer3(0);
726  Y(86) := X(5).Layer3(0);
727  Y(87) := X(6).Layer3(0);
728  Y(88) := X(7).Layer3(0);
729  Y(89) := X(8).Layer3(0);
730  Y(90) := X(0).Hadron(0);
731  Y(91) := X(1).Hadron(0);
732  Y(92) := X(2).Hadron(0);
733  Y(93) := X(3).Hadron(0);
734  Y(94) := X(4).Hadron(0);
735  Y(95) := X(5).Hadron(0);
736  Y(96) := X(6).Hadron(0);
737  Y(97) := X(7).Hadron(0);
738  Y(98) := X(8).Hadron(0);
739  return Y;
740  end;
741 
742 end DataTypes;
External data-types and functions.
( OUTPUT_TOBS- 1 downto 0) AlgoTriggerObject AlgoOutput
Algorithm OUTPUT port.
array(natural range <> ) of AlgoTriggerObject AlgoTriggerObjects
Algorithm OUTPUT port.
std_logic_vector( OUT_TOB_WIDTH- 1 downto 0) AlgoTriggerObject
Algorithm Trigger Object TOB.
std_logic_vector( OUT_XTOB_WIDTH- 1 downto 0) AlgoXTriggerObject
Algorithm Extended Trigger Object XTOB.
( OUTPUT_TOBS- 1 downto 0) AlgoXTriggerObject AlgoXOutput
Algorithm XOUTPUT port.
integer := 5 HADRONIC_POSITION_BIT_START
000 Centre, 001 Near -eta, 010 Near +eta, 011 Far -eta, 100 Far +eta
Definition: DataTypes.vhd:73