1 /* 2 ************************************************************************************************************************ 3 * 4 * Copyright (C) 2007-2022 Advanced Micro Devices, Inc. All rights reserved. 5 * SPDX-License-Identifier: MIT 6 * 7 ***********************************************************************************************************************/ 8 9 // Class used to define a coordinate bit 10 11 #ifndef __COORD_H 12 #define __COORD_H 13 14 namespace Addr 15 { 16 namespace V2 17 { 18 #if defined(__cplusplus) 19 #if defined(_MSC_VER) 20 #if _MSC_VER >= 1900 21 #define ADDR_CPP11_COMPILER TRUE 22 #endif 23 #else 24 #if __cplusplus >= 201103L 25 #define ADDR_CPP11_COMPILER TRUE 26 #endif 27 #endif 28 #endif 29 30 #if defined(ADDR_CPP11_COMPILER) 31 enum Dim : INT_8 32 #else 33 enum Dim 34 #endif 35 { 36 DIM_X, 37 DIM_Y, 38 DIM_Z, 39 DIM_S, 40 DIM_M, 41 NUM_DIMS 42 }; 43 44 class Coordinate 45 { 46 public: 47 Coordinate(); 48 Coordinate(enum Dim dim, INT_32 n); 49 50 VOID set(enum Dim dim, INT_32 n); 51 UINT_32 ison(const UINT_32 *coords) const; 52 enum Dim getdim(); 53 INT_8 getord(); 54 55 BOOL_32 operator==(const Coordinate& b); 56 BOOL_32 operator<(const Coordinate& b); 57 BOOL_32 operator>(const Coordinate& b); 58 BOOL_32 operator<=(const Coordinate& b); 59 BOOL_32 operator>=(const Coordinate& b); 60 BOOL_32 operator!=(const Coordinate& b); 61 Coordinate& operator++(INT_32); 62 63 private: 64 enum Dim dim; 65 INT_8 ord; 66 }; 67 68 class CoordTerm 69 { 70 public: 71 CoordTerm(); 72 VOID Clear(); 73 VOID add(Coordinate& co); 74 VOID add(CoordTerm& cl); 75 BOOL_32 remove(Coordinate& co); 76 BOOL_32 Exists(Coordinate& co); 77 VOID copyto(CoordTerm& cl); 78 UINT_32 getsize(); 79 UINT_32 getxor(const UINT_32 *coords) const; 80 81 VOID getsmallest(Coordinate& co); 82 UINT_32 Filter(INT_8 f, Coordinate& co, UINT_32 start = 0, enum Dim axis = NUM_DIMS); 83 Coordinate& operator[](UINT_32 i); 84 BOOL_32 operator==(const CoordTerm& b); 85 BOOL_32 operator!=(const CoordTerm& b); 86 BOOL_32 exceedRange(const UINT_32 *ranges); 87 88 private: 89 static const UINT_32 MaxCoords = 8; 90 UINT_32 num_coords; 91 Coordinate m_coord[MaxCoords]; 92 }; 93 94 class CoordEq 95 { 96 public: 97 CoordEq(); 98 VOID remove(Coordinate& co); 99 BOOL_32 Exists(Coordinate& co); 100 VOID resize(UINT_32 n); 101 UINT_32 getsize(); 102 virtual UINT_64 solve(const UINT_32 *coords) const; 103 virtual VOID solveAddr(UINT_64 addr, UINT_32 sliceInM, 104 UINT_32 *coords) const; 105 106 VOID copy(CoordEq& o, UINT_32 start = 0, UINT_32 num = 0xFFFFFFFF); 107 VOID reverse(UINT_32 start = 0, UINT_32 num = 0xFFFFFFFF); 108 VOID xorin(CoordEq& x, UINT_32 start = 0); 109 UINT_32 Filter(INT_8 f, Coordinate& co, UINT_32 start = 0, enum Dim axis = NUM_DIMS); 110 VOID shift(INT_32 amount, INT_32 start = 0); 111 virtual CoordTerm& operator[](UINT_32 i); 112 VOID mort2d(Coordinate& c0, Coordinate& c1, UINT_32 start = 0, UINT_32 end = 0); 113 VOID mort3d(Coordinate& c0, Coordinate& c1, Coordinate& c2, UINT_32 start = 0, UINT_32 end = 0); 114 115 BOOL_32 operator==(const CoordEq& b); 116 BOOL_32 operator!=(const CoordEq& b); 117 118 private: 119 static const UINT_32 MaxEqBits = 64; 120 UINT_32 m_numBits; 121 122 CoordTerm m_eq[MaxEqBits]; 123 }; 124 125 } // V2 126 } // Addr 127 128 #endif 129 130