X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsyzygy%2Ftbcore.h;fp=src%2Fsyzygy%2Ftbcore.h;h=b80298e6a46505dfa05b5e3db37aac6f6fa8419c;hp=0000000000000000000000000000000000000000;hb=7caa6cd3383cf90189a1947c9bdf9c6fea1172a6;hpb=4509eb1342fe282d08bd90340efaff4df5947a87 diff --git a/src/syzygy/tbcore.h b/src/syzygy/tbcore.h new file mode 100644 index 00000000..b80298e6 --- /dev/null +++ b/src/syzygy/tbcore.h @@ -0,0 +1,157 @@ +/* + Copyright (c) 2011-2013 Ronald de Man +*/ + +#ifndef TBCORE_H +#define TBCORE_H + +#ifndef __WIN32__ +#include +#define SEP_CHAR ':' +#define FD int +#define FD_ERR -1 +#else +#include +#define SEP_CHAR ';' +#define FD HANDLE +#define FD_ERR INVALID_HANDLE_VALUE +#endif + +#ifndef __WIN32__ +#define LOCK_T pthread_mutex_t +#define LOCK_INIT(x) pthread_mutex_init(&(x), NULL) +#define LOCK(x) pthread_mutex_lock(&(x)) +#define UNLOCK(x) pthread_mutex_unlock(&(x)) +#else +#define LOCK_T HANDLE +#define LOCK_INIT(x) do { x = CreateMutex(NULL, FALSE, NULL); } while (0) +#define LOCK(x) WaitForSingleObject(x, INFINITE) +#define UNLOCK(x) ReleaseMutex(x) +#endif + +#define WDLSUFFIX ".rtbw" +#define DTZSUFFIX ".rtbz" +#define WDLDIR "RTBWDIR" +#define DTZDIR "RTBZDIR" +#define TBPIECES 6 + +typedef unsigned long long uint64; +typedef unsigned int uint32; +typedef unsigned char ubyte; +typedef unsigned short ushort; + +const ubyte WDL_MAGIC[4] = { 0x71, 0xe8, 0x23, 0x5d }; +const ubyte DTZ_MAGIC[4] = { 0xd7, 0x66, 0x0c, 0xa5 }; + +#define TBHASHBITS 10 + +struct TBHashEntry; + +typedef uint64 base_t; + +struct PairsData { + char *indextable; + ushort *sizetable; + ubyte *data; + ushort *offset; + ubyte *symlen; + ubyte *sympat; + int blocksize; + int idxbits; + int min_len; + base_t base[1]; // C++ complains about base[]... +}; + +struct TBEntry { + char *data; + uint64 key; + uint64 mapping; + ubyte ready; + ubyte num; + ubyte symmetric; + ubyte has_pawns; +} __attribute__((__may_alias__)); + +struct TBEntry_piece { + char *data; + uint64 key; + uint64 mapping; + ubyte ready; + ubyte num; + ubyte symmetric; + ubyte has_pawns; + ubyte enc_type; + struct PairsData *precomp[2]; + int factor[2][TBPIECES]; + ubyte pieces[2][TBPIECES]; + ubyte norm[2][TBPIECES]; +}; + +struct TBEntry_pawn { + char *data; + uint64 key; + uint64 mapping; + ubyte ready; + ubyte num; + ubyte symmetric; + ubyte has_pawns; + ubyte pawns[2]; + struct { + struct PairsData *precomp[2]; + int factor[2][TBPIECES]; + ubyte pieces[2][TBPIECES]; + ubyte norm[2][TBPIECES]; + } file[4]; +}; + +struct DTZEntry_piece { + char *data; + uint64 key; + uint64 mapping; + ubyte ready; + ubyte num; + ubyte symmetric; + ubyte has_pawns; + ubyte enc_type; + struct PairsData *precomp; + int factor[TBPIECES]; + ubyte pieces[TBPIECES]; + ubyte norm[TBPIECES]; + ubyte flags; // accurate, mapped, side + ushort map_idx[4]; + ubyte *map; +}; + +struct DTZEntry_pawn { + char *data; + uint64 key; + uint64 mapping; + ubyte ready; + ubyte num; + ubyte symmetric; + ubyte has_pawns; + ubyte pawns[2]; + struct { + struct PairsData *precomp; + int factor[TBPIECES]; + ubyte pieces[TBPIECES]; + ubyte norm[TBPIECES]; + } file[4]; + ubyte flags[4]; + ushort map_idx[4][4]; + ubyte *map; +}; + +struct TBHashEntry { + uint64 key; + struct TBEntry *ptr; +}; + +struct DTZTableEntry { + uint64 key1; + uint64 key2; + struct TBEntry *entry; +}; + +#endif +