SMAUG
Simulating Machine Learning Applications on gem5-Aladdin
Macros
Multi-dim arrays in C

Use these convenience macros to cast a raw pointer into a multidimensional variable-length array, which lets us use [] notation instead of manually linearizing the index. More...

Macros

#define ARRAY_1D(TYPE, output_array_name, input_array_name)   TYPE* output_array_name = (TYPE*)input_array_name
 
#define ARRAY_2D(TYPE, output_array_name, input_array_name, DIM_1)   TYPE(*output_array_name)[DIM_1] = (TYPE(*)[DIM_1])input_array_name
 
#define ARRAY_3D(TYPE, output_array_name, input_array_name, DIM_1, DIM_2)
 
#define ARRAY_4D( TYPE, output_array_name, input_array_name, DIM_1, DIM_2, DIM_3)
 
#define ARRAY_5D( TYPE, output_array_name, input_array_name, DIM_1, DIM_2, DIM_3, DIM_4)
 
#define VEC_ARRAY_1D(TYPE, output_array_name, input_array_name)   TYPE* output_array_name = (TYPE*)(input_array_name)
 
#define VEC_ARRAY_2D(TYPE, output_array_name, input_array_name, cols)
 
#define VEC_ARRAY_3D(TYPE, output_array_name, input_array_name, rows, cols)
 
#define VEC_ARRAY_4D( TYPE, output_array_name, input_array_name, height, rows, cols)
 

Detailed Description

Use these convenience macros to cast a raw pointer into a multidimensional variable-length array, which lets us use [] notation instead of manually linearizing the index.

Usage: Suppose we have an int* array pointer.

To convert this into a multidimensional array, call the appropriate macro, providing the type, a new variable name (often the same as the original with an underscore prefixed), and then listing out all but the first dimension.

For example:

// To convert into a 5x4 array:
ARRAY_2D(int, _array, array, 4);
_array[0][1] = 1;
// To convert into a 5x4x3 array:
ARRAY_3D(int, _array, array, 4, 3);
_array[0][1][2] = 1;
// To convert into a 5x4x3x2 array:
ARRAY_4D(int, _array, array, 4, 3, 2);
_array[0][1][2][3] = 1;

Macro Definition Documentation

◆ ARRAY_3D

#define ARRAY_3D (   TYPE,
  output_array_name,
  input_array_name,
  DIM_1,
  DIM_2 
)
Value:
TYPE(*output_array_name)[DIM_1][DIM_2] = \
(TYPE(*)[DIM_1][DIM_2])input_array_name

Definition at line 436 of file common.h.

◆ ARRAY_4D

#define ARRAY_4D (   TYPE,
  output_array_name,
  input_array_name,
  DIM_1,
  DIM_2,
  DIM_3 
)
Value:
TYPE(*output_array_name)[DIM_1][DIM_2][DIM_3] = \
(TYPE(*)[DIM_1][DIM_2][DIM_3])input_array_name

Definition at line 440 of file common.h.

◆ ARRAY_5D

#define ARRAY_5D (   TYPE,
  output_array_name,
  input_array_name,
  DIM_1,
  DIM_2,
  DIM_3,
  DIM_4 
)
Value:
TYPE(*output_array_name)[DIM_1][DIM_2][DIM_3][DIM_4] = \
(TYPE(*)[DIM_1][DIM_2][DIM_3][DIM_4])input_array_name

Definition at line 445 of file common.h.

◆ VEC_ARRAY_2D

#define VEC_ARRAY_2D (   TYPE,
  output_array_name,
  input_array_name,
  cols 
)
Value:
TYPE(*output_array_name) \
[(cols) / (VECTOR_SIZE)] = \
(TYPE(*)[(cols) / (VECTOR_SIZE)]) input_array_name

Definition at line 453 of file common.h.

◆ VEC_ARRAY_3D

#define VEC_ARRAY_3D (   TYPE,
  output_array_name,
  input_array_name,
  rows,
  cols 
)
Value:
TYPE(*output_array_name) \
[(rows)][(cols) / (VECTOR_SIZE)] = \
(TYPE(*)[(rows)][(cols) / (VECTOR_SIZE)]) input_array_name

Definition at line 458 of file common.h.

◆ VEC_ARRAY_4D

#define VEC_ARRAY_4D (   TYPE,
  output_array_name,
  input_array_name,
  height,
  rows,
  cols 
)
Value:
TYPE(*output_array_name) \
[(height)][(rows)][(cols) / (VECTOR_SIZE)] = \
(TYPE(*)[(height)][(rows)][(cols) / (VECTOR_SIZE)]) \
input_array_name

Definition at line 463 of file common.h.

VECTOR_SIZE
#define VECTOR_SIZE
Vector size used in SMV backends.
Definition: common.h:293