Giter Site home page Giter Site logo

ucla-vast / autosa Goto Github PK

View Code? Open in Web Editor NEW
187.0 9.0 31.0 35.65 MB

AutoSA: Polyhedral-Based Systolic Array Compiler

License: MIT License

Makefile 0.73% Shell 6.69% M4 0.15% C 18.35% C++ 58.44% Python 15.19% Tcl 0.40% Dockerfile 0.02% CMake 0.03%
systolic-arrays polyhedral-model automatic-generation fpga

autosa's Introduction

AutoSA: Polyhedral-Based Systolic Array Auto-Compilation

Documentation | Installation | Tutorials | Examples

This repository includes the code for AutoSA. AutoSA is an end-to-end systolic array compiler based on the polyhedral model. It takes algorithms in high-level programming languages (C) as inputs, performs polyhedral transformation and other architecture optimizations to map algorithms to systolic array architecture. The generated designs are in HLS C.

Quick Start

We offer a Docker image for quick start.

docker pull whbldhwj/autosa:latest

Let's try one small example. The input code can be found at ${AUTOSA_ROOT}/autosa_tests/mm/kernel.c. The code region to be transformed to systolic array is annotated using a pair of pragmas scop and endscop.

  1. Generating HLS C Code.

Run the following command to compile generate a systolic array.

./autosa ./autosa_tests/mm/kernel.c \
--config=./autosa_config/autosa_config.json \
--target=autosa_hls_c \
--output-dir=./autosa.tmp/output \
--sa-sizes="{kernel[]->space_time[3];kernel[]->array_part[16,16,16];kernel[]->latency[8,8];kernel[]->simd[2]}" \
--simd-info=./autosa_tests/mm/simd_info.json \
--host-serialize

The generated code can be found in ${AUTOSA_ROOT}/autosa.tmp/output/src/. For detailed explaination of each AutoSA compilation option, please run

./autosa --help

or refer to AutoSA Compilation Options.

  1. Generating FPGA Bitstream

To generate the final bitsteam, set up your local Vitis development kit first. Then execute the makefile to build the design.

cp ${AUTOSA_ROOT}/autosa_tests/mm/Makefile autosa.tmp/output/
cp ${AUTOSA_ROOT}/autosa_tests/mm/connectivity.cfg autosa.tmp/output/
cd ${AUTOSA_ROOT}/autosa.tmp/output
make all

Makefile Options Descriptions

  • MODE := hw_emu: Set the build configuration mode to HW Emulation, other modes: sw_emu|hw
  • PLATFORM := xilinx_u250_xdma_201830_2: Select the target platform
  • KERNEL_SRC := src/kernel_kernel.cpp: List the kernel source files
  • HOST_SRC := src/kernel_host.cpp: List the host source files

The connectivity.cfg describes the DRAM port mapping. For more details about how to change the DRAM port mapping, please refer to the Xilinx tutorials.

  1. Verifying Designs Using Xilinx HLS

AutoSA also supports generate HLS projects. Add the flag

--hls

to the command when compiling the program.

./autosa ./autosa_tests/mm/kernel.c \
--config=./autosa_config/autosa_config.json \
--target=autosa_hls_c \
--output-dir=./autosa.tmp/output \
--sa-sizes="{kernel[]->space_time[3];kernel[]->array_part[16,16,16];kernel[]->latency[8,8];kernel[]->simd[2]}" \
--simd-info=./autosa_tests/mm/simd_info.json \
--host-serialize \
--hls

AutoSA will generate an HLS host file ${AUTOSA_ROOT}/autosa.tmp/output/src/kernel_host.cpp instead of the OpenCL host file generated in the previous step. To build the HLS project, run the following commands.

cp ${AUTOSA_ROOT}/autosa_scripts/hls_scripts/hls_script.tcl autosa.tmp/output/
cd ${AUTOSA_ROOT}/autosa.tmp/output
vivado_hls -f hls_script.tcl

For more detailed instructions on using AutoSA, please refer to the AutoSA Documentation.

Send Us Failure Cases and Feedback!

AutoSA is open source for research purposes, and we would like to continously improve it! Please let us know if...

  1. you find any bug in the AutoSA code.
  2. you find any application that fails the compilation flow of AutoSA.
  3. you know how to further help improve any part of the compiler.
  4. etc.

Authors and Contributors

AutoSA is currently maintained by Jie Wang. Besides, we gratefully acknowledge the authors of PPCG for developing and actively maintaining PPCG as an open-source project.

Papers

More implementation details of AutoSA are covered in our paper. If you find this project useful in your research, please consider citing:

@inproceedings{wang2021autosa,
  title={AutoSA: A Polyhedral Compiler for High-Performance Systolic Arrays on FPGA},
  author={Wang, Jie and Guo, Licheng and Cong, Jason},
  booktitle={Proceedings of the 2021 ACM/SIGDA International Symposium on Field-Programmable Gate Arrays},
  year={2021}
}

autosa's People

Contributors

dotkrnl avatar rbaghdadi avatar svenvh avatar tobiasgrosser avatar whbldhwj avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

autosa's Issues

Error caused by --host-serialize

When I tried to simulate the Convolutional Neural Network (Single Layer, Small) example provided, it generated an error as below

================= IO Grouping Information =================
terminate called after throwing an instance of 'std::out_of_range'
  what():  stoi
[AutoSA] Error: Exit abnormally!

the command is posted below

./autosa ./autosa_tests/cnn/kernel.c \
--config=./autosa_config/autosa_config.json \
--target=autosa_hls_c \
--output-dir=./autosa.tmp/output \
--sa-sizes="{kernel[]->space_time[4];kernel[]->array_part[8,8,4,8];kernel[]->latency[4,2,4];kernel[]->simd[1,1,1,2]}" \
--simd-info=./autosa_tests/cnn/simd_info.json \
--host-serialize \
--no-reverse-order \
--hls

And I found that there are two ways to deal with the error:

  1. remove --host-serialize option from the command.
  2. decrease variable defined in kernel.h.

I want to know how --host-serialize caused this problem, which really made me confused.

Error: unsupported TPExpr function type: NULL

Hi,

I am trying to make a toy MLP example (two layer) using AutoSA (for FCCM workshop demo). The last dense layer is implemented as a systolic array. I was able to generate a SA with the previous commit (the one that I pulled back two weeks ago). However, after updating to the latest commit, I got the following errors:

[AutoSA] No candidate loops found!
[AutoSA] Apply communication management.
[AutoSA] Error: unsupported TPExpr function type: NULL
[AutoSA] Error: Exit abnormally!

The input c code:

#include <stdio.h>
int main(int argc, char **argv) {

      float L2[1][10];
      float FL[1][64];
      float w2[64][10];
#pragma scop
      for (int j1 = 0; j1 < 10; ++j1) {
        L2[0][j1] = 0.000000e+00f;
        for (int k1 = 0; k1 < 64; ++k1) {
          L2[0][j1] = (L2[0][j1] + (FL[0][k1] * w2[k1][j1]));
        }
      }
#pragma endscop
      printf("%f", L2[0][0]);
      printf("%f", FL[0][0]);
      printf("%f", w2[0][0]);
}

The command I used

cd /usr/src/docker_autosa; ./autosa /usr/src/heterocl/samples/mlp/hcl_autosa_tmp_inst1.c --config=./autosa_config/autosa_config.json --target=autosa_hls_c --output-dir=./autosa.tmp/output --sa-sizes="{kernel[]->space_time[2];kernel[]->array_part[10,8];kernel[]->latency[2,8];kernel[]->simd[2]}" --simd-info=./autosa_tests/mm_hcl/simd_info.json --hls --hcl --no-data-pack --local-reduce --reduce-op="+" --simd-touch-space --host-serialize

Cannot run LU example and CNN example on HW

Hi, it is me again.

Just to report two new issues I found recently.

  1. large MM (intel) will result in deadlock on real hardware execution. I tried different SA configurations, and none of them worked. I tested on vLab S10 GX2800 with AOC 18.2. The only change I've made is that I removed the __burst intrinsics and HBM attribute since there is no HBM on that device.

  2. LU example on Alveo FPGA board. I changed the input matrix size to 8x8. I was able to compile the generated code. However, the HW result is not 100% correct. Is this example only tested for 3x3?

Program received signal SIGSEGV, Segmentation fault

Hi, there is a core dump problem after I run the install.sh and execute the autoisa program:

#0 0x00007ffff65666c5 in isl_space_is_params () from /home/AutoSA/src/isl/.libs/libisl.so.22
#1 0x00007ffff656b5bc in isl_space_params () from /home//AutoSA/src/isl/.libs/libisl.so.22
#2 0x00007ffff658ea8b in isl_union_map_empty_space () from /home/davi/AutoSA/src/isl/.libs/libisl.so.22
#3 0x0000555555585622 in compute_tagged_rar_dep (ps=0x5555559ab890) at ppcg.c:999
#4 0x00005555555859a4 in compute_dependences (scop=0x5555559ab890) at ppcg.c:1103
#5 0x0000555555586152 in ppcg_scop_from_pet_scop (scop=0x5555559bcc70, options=0x5555558073d0) at ppcg.c:1284
#6 0x0000555555586336 in transform (p=0x55555580ca10, scop=0x5555559bcc70, user=0x7fffffffdf20) at ppcg.c:1349
#7 0x00007ffff6bb2b22 in pet_transform (scop=0x5555559bcc70, user=0x7fffffffde80) at pet.cc:1297
#8 0x00007ffff6bb35fd in PetASTConsumer::call_fn (scop=, this=0x7fffffffdd00) at pet.cc:660
#9 PetASTConsumer::scan_scops (fd=0x555555960838, this=0x7fffffffdd00) at pet.cc:691
#10 PetASTConsumer::HandleTopLevelDecl (this=0x7fffffffdd00, dg=...) at pet.cc:723
#11 0x00007ffff6ca57e3 in clang::ParseAST(clang::Sema&, bool, bool) () from /home/davi/AutoSA/src/pet/.libs/libpet.so.10
#12 0x00007ffff6bb7d0d in foreach_scop_in_C_source (ctx=ctx@entry=0x555555807620,
filename=filename@entry=0x555555807940 "../autosa_tests/mm/kernel.c", function=function@entry=0x0, options=,
fn=fn@entry=0x7ffff6bb2ab0 <pet_transform(pet_scop*, void*)>, user=user@entry=0x7fffffffde80) at pet.cc:1174
#13 0x00007ffff6bb81be in pet_foreach_scop_in_C_source (ctx=ctx@entry=0x555555807620,
filename=filename@entry=0x555555807940 "../autosa_tests/mm/kernel.c", function=function@entry=0x0,
fn=fn@entry=0x7ffff6bb2ab0 <pet_transform(pet_scop*, void*)>, user=user@entry=0x7fffffffde80) at pet.cc:1204
#14 0x00007ffff6bb8307 in pet_transform_C_source (ctx=0x555555807620, input=, out=,
transform=0x5555555862b1 , user=0x7fffffffdf20) at pet.cc:1340
#15 0x00005555555863e2 in ppcg_transform (ctx=0x555555807620, input=0x555555807940 "../autosa_tests/mm/kernel.c",
out=0x555555807a80, options=0x5555558073d0, fn=0x5555555b2df0 <generate_wrap(isl_printer*, ppcg_scop*, void*)>,
user=0x7fffffffdf50) at ppcg.c:1372
#16 0x00005555555b3156 in generate_sa (ctx=ctx@entry=0x555555807620,
input=input@entry=0x555555807940 "../autosa_tests/mm/kernel.c", out=0x555555807a80, options=options@entry=0x5555558073d0,
---Type to continue, or q to quit---
print=print@entry=0x5555555b79e0 <print_hw(isl_printer*, autosa_prog*, isl_ast_node*, autosa_hw_module**, int, autosa_hw_top_module*, autosa_drain_merge_func**, int, autosa_types*, void*)>, user=user@entry=0x7fffffffe030) at autosa_trans.cpp:3664
#17 0x00005555555ba11e in generate_autosa_xilinx_hls_c (ctx=0x555555807620, options=0x5555558073d0,
input=0x555555807940 "../autosa_tests/mm/kernel.c") at autosa_xilinx_hls_c.cpp:2956
#18 0x000055555558667e in autosa_main_wrap (argc=1, argv=0x7fffffffe1c8) at ppcg.c:1458
#19 0x00007ffff58fdb97 in __libc_start_main (main=0x5555555685a0 <main(int, char**)>, argc=10, argv=0x7fffffffe1c8,
init=, fini=, rtld_fini=, stack_end=0x7fffffffe1b8) at ../csu/libc-start.c:310
#20 0x000055555556878a in _start ()

[AutoSA] Error: Single outermost permutable band not found.

Input kernel C program:

int main(int argc, char **argv) {
  int W[64][64], X[64][64], Y[64][64];
  #pragma scop
      for (int x = 0; x < 64; ++x) {
        for (int y = 0; y < 64; ++y) {
          int sum = 0;
          for (int k = 0; k < 64; ++k) {
            sum = ((W[x][k] * X[k][y]) + sum);
          }
          Y[x][y] = sum;
        }
      }
  #pragma endscop
}
root@883e5b3a54f8:/usr/src/docker_autosa# ./autosa /usr/src/heterocl/tests/hcl_autosa_tmp.c --config=./autosa_config/autosa_config.json --target=autosa_hls_c --output-dir=./autosa.tmp/output --sa-sizes="{kernel[]->space_time[3];kernel[]->array_part[16,16,16];kernel[]->latency[8,8];kernel[]->simd[2]}" --simd-info=./autosa_tests/mm/simd_info.json --host-serialize
terminate called after throwing an instance of 'std::runtime_error'
  what():  [AutoSA] Error: Single outermost permutable band not found.

Broken Functionality?

I tried some of the tests following the example documentations.

I found Vitis SW emulation and Vitis HLS C simulation does not pass the basic tests.

Is the functionality broken? :(

Number of HBM Channels

Hello,

Is there a way to increase the number of HBM channels used to make full use of the bandwidth? It is fixed to 6 ports in the mm_HBM example. Could the number of PEs and therefore the channels they are connected to be increased?

Thanks,

Docker image issue

I am using the latest docker image, and I run the container with sudo docker run -it whbldhwj/autosa:latest /bin/bash.
When trying to run ./autosa --help in this container, all I see is the error [AutoSA] Error: Exit abnormally!.

Is there some obvious mistake I am making here?

Deadlock in large size GEMM SA

I am able to compile and run small-size GEMM with AutoSA. However, for a large size GEMM, I kept running into deadlock in both emulation and real hardware.

(ubuntu) [sx233@brg-zhang-xcel temp.autosa.large-u280-2020.2]$ XCL_EMULATION_MODE=sw_emu ./host build_dir.sw_emu.xilinx_u280_xdma_201920_3/kernel.xclbin

Found Platform

Platform Name: XilinxFound Device=xilinx_u280_xdma_201920_3
 Loading: build_dir.sw_emu.xilinx_u280_xdma_201920_3/kernel.xclbin

GEMM SA Intel OpenCL code does not compile with AOC 19.2

It seems that this intrinsic cannot be found with AOC 19.2

/home/u68165/temp.aoc.1024.8x8-s10/kernel.cl:948:16: error: implicit declaration of function '__burst_coalesced_load' is invalid in OpenCL
    mem_data = __burst_coalesced_load(&A[i]);
               ^
/home/u68165/temp.aoc.1024.8x8-s10/kernel.cl:948:14: error: assigning to 'A_t16' (aka 'struct A_t16_t') from incompatible type 'int'
    mem_data = __burst_coalesced_load(&A[i]);
             ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/u68165/temp.aoc.1024.8x8-s10/kernel.cl:2543:16: warning: use of out-of-scope declaration of '__burst_coalesced_load'
    mem_data = __burst_coalesced_load(&B[i]);
               ^
/home/u68165/temp.aoc.1024.8x8-s10/kernel.cl:948:16: note: previous declaration is here
    mem_data = __burst_coalesced_load(&A[i]);

Only specific coding style can pass compilation

Hi,

I just installed AutoSA and tried to make some code generation for systolic arrays. It seems AutoSA has a very strict coding style. I wonder why in the following GEMM example. Only the second can work, but the first way cannot.

#include <algorithm>
#include <ap_axi_sdata.h>
#include <ap_fixed.h>
#include <ap_int.h>
#include <hls_math.h>
#include <hls_stream.h>
#include <math.h>
#include <stdint.h>
using namespace std;
void Stage_C(
  int32_t A0[32][32],
  int32_t B1[32][32],
  int32_t C2[32][32]
) {	// L13
#pragma scop
  l_i3: for (int i3 = 0; i3 < 32; i3 += 1) {	// L14
    l_j4: for (int j4 = 0; j4 < 32; j4 += 1) {	// L15
      l_k6: for (int k6 = 0; k6 < 32; k6 += 1) {	// L20
        // 1st
        int32_t v7 = A0[i3][k6];	// L21
        int32_t v8 = B1[k6][j4];	// L22
        C2[i3][j4] += v7 * v8;	// L26
        // 2nd
        // C2[i3][j4] += A0[i3][k6] * B1[k6][j4];	// L26
      }
    }
  }
#pragma endscop
}

If I use the first way, the compiler gives the following error.

$./autosa test.cpp -I"$(dirname "$(which vivado_hls)")"/../include --config=./autosa_config/autosa_config.json --target=autosa_hls_c --output-dir=./autosa.tmp/output --sa-sizes="{kernel[]->space_time[3];}"
lt-autosa: /work/shared/common/usr/local/include/clang/AST/Decl.h:276: llvm::StringRef clang::NamedDecl::getName() const: Assertion `Name.isIdentifier() && "Name is not a simple identifier"' failed.
[AutoSA] Error: Exit abnormally!

Is this a limitation of AutoSA or are there something wrong with my code? Thanks!

Cannot create docker image using the dockerfile

Hi,

I want to create a docker image with a stable commit of AutoSA (i.e. this one: 15c877b). However, I ran into this error when building the image

Makefile.am:67: but option 'subdir-objects' is disabledMakefile.am:59: warning: source file '$(poly_src)/testlib.c' is in a subdirectory,
Makefile.am:59: but option 'subdir-objects' is disabled
Makefile.am:68: warning: source file '$(poly_src)/verif_ehrhart.c' is in a subdirectory,
Makefile.am:68: but option 'subdir-objects' is disabled
Makefile.am: installing '../depcomp'
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, 'build-aux'.
libtoolize: copying file 'build-aux/ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.libtoolize: copying file 'm4/libtool.m4'
libtoolize: copying file 'm4/ltoptions.m4'
libtoolize: copying file 'm4/ltsugar.m4'
libtoolize: copying file 'm4/ltversion.m4'
libtoolize: copying file 'm4/lt~obsolete.m4'
configure.ac:9: installing 'build-aux/compile'
configure.ac:12: installing 'build-aux/config.guess'
configure.ac:12: installing 'build-aux/config.sub'
configure.ac:4: installing 'build-aux/install-sh'
configure.ac:4: installing 'build-aux/missing'
Makefile.am: installing 'build-aux/depcomp'
parallel-tests: installing 'build-aux/test-driver'
configure
./install.sh: 16: ./configure: not found
make
make: *** No targets specified and no makefile found.  Stop.
Removing intermediate container b13cdb4058b4
 ---> 84c4cdc9fc6b
Successfully built 84c4cdc9fc6b
Successfully tagged autosa:latest

Cloud you please kindly create a docker image of that old commit with a different tag?

C-sim errors on Depth-wise Convolution

Hi, there are some unsatisfied errors happened when I complied ur DWC kernel following this link : https://autosa.readthedocs.io/en/latest/examples/dnn_ops.html

Vivado 2020.1 (Used)


Results show like:
`****** Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC v2020.1 (64-bit)
  **** SW Build 2902540 on Wed May 27 19:54:35 MDT 2020
  **** IP Build 2902112 on Wed May 27 22:43:36 MDT 2020
    ** Copyright 1986-2020 Xilinx, Inc. All Rights Reserved.

source /tools/Xilinx/Vivado/2020.1/scripts/vivado_hls/hls.tcl -notrace
INFO: [HLS 200-10] Running '/tools/Xilinx/Vivado/2020.1/bin/unwrapped/lnx64.o/vivado_hls'
INFO: [HLS 200-10] For user 'enai' on host 'enai-System-Product-Name' (Linux_x86_64 version 5.4.0-94-generic) on Mon Feb 14 16:25:59 HKT 2022
INFO: [HLS 200-10] On os Ubuntu 18.04.6 LTS
INFO: [HLS 200-10] In directory '/home/enai/Desktop/project/reference_works/AutoSA/autosa.tmp/output'
Sourcing Tcl script 'hls_script.tcl'
INFO: [HLS 200-10] Creating and opening project '/home/enai/Desktop/project/reference_works/AutoSA/autosa.tmp/output/hls_prj'.
INFO: [HLS 200-10] Adding design file 'src/kernel_kernel.h' to the project
INFO: [HLS 200-10] Adding design file 'src/kernel_kernel.cpp' to the project
INFO: [HLS 200-10] Adding test bench file 'src/kernel_host.cpp' to the project
INFO: [HLS 200-10] Creating and opening solution '/home/enai/Desktop/project/reference_works/AutoSA/autosa.tmp/output/hls_prj/solution1'.
INFO: [HLS 200-10] Setting target device to 'xcu200-fsgd2104-2-e'
INFO: [SYN 201-201] Setting up clock 'default' with a period of 5ns.
INFO: [XFORM 203-1161] The maximum of name length is set into 50.
INFO: [SIM 211-2] *************** CSIM start ***************
INFO: [SIM 211-4] CSIM will launch GCC as the compiler.
   Compiling ../../../../src/kernel_host.cpp in debug mode
   Compiling ../../../../src/kernel_kernel.cpp in debug mode
   Generating csim.exe
WARNING: Hls::stream 'hls::stream<ap_uint<64>, 0>.2' contains leftover data, which may result in RTL simulation hanging.
(golden, hw)@(4, 0, 0): (144.000000, 0.000000)
(golden, hw)@(4, 0, 1): (144.000000, 0.000000)
(golden, hw)@(4, 0, 2): (144.000000, 0.000000)
(golden, hw)@(4, 0, 3): (144.000000, 0.000000)
(golden, hw)@(4, 0, 4): (144.000000, 0.000000)
(golden, hw)@(4, 0, 5): (144.000000, 0.000000)
(golden, hw)@(4, 0, 6): (144.000000, 0.000000)
(golden, hw)@(4, 0, 7): (144.000000, 0.000000)
(golden, hw)@(4, 1, 0): (144.000000, 0.000000)
(golden, hw)@(4, 1, 1): (144.000000, 0.000000)
(golden, hw)@(4, 1, 2): (144.000000, 0.000000)
(golden, hw)@(4, 1, 3): (144.000000, 0.000000)
(golden, hw)@(4, 1, 4): (144.000000, 0.000000)
(golden, hw)@(4, 1, 5): (144.000000, 0.000000)
(golden, hw)@(4, 1, 6): (144.000000, 0.000000)
(golden, hw)@(4, 1, 7): (144.000000, 0.000000)
(golden, hw)@(4, 2, 0): (144.000000, 0.000000)
(golden, hw)@(4, 2, 1): (144.000000, 0.000000)
(golden, hw)@(4, 2, 2): (144.000000, 0.000000)
(golden, hw)@(4, 2, 3): (144.000000, 0.000000)
(golden, hw)@(4, 2, 4): (144.000000, 0.000000)
(golden, hw)@(4, 2, 5): (144.000000, 0.000000)
(golden, hw)@(4, 2, 6): (144.000000, 0.000000)
(golden, hw)@(4, 2, 7): (144.000000, 0.000000)
(golden, hw)@(4, 3, 0): (144.000000, 0.000000)
(golden, hw)@(4, 3, 1): (144.000000, 0.000000)
(golden, hw)@(4, 3, 2): (144.000000, 0.000000)
(golden, hw)@(4, 3, 3): (144.000000, 0.000000)
(golden, hw)@(4, 3, 4): (144.000000, 0.000000)
(golden, hw)@(4, 3, 5): (144.000000, 0.000000)
(golden, hw)@(4, 3, 6): (144.000000, 0.000000)
(golden, hw)@(4, 3, 7): (144.000000, 0.000000)
(golden, hw)@(4, 4, 0): (144.000000, 0.000000)
(golden, hw)@(4, 4, 1): (144.000000, 0.000000)
(golden, hw)@(4, 4, 2): (144.000000, 0.000000)
(golden, hw)@(4, 4, 3): (144.000000, 0.000000)
(golden, hw)@(4, 4, 4): (144.000000, 0.000000)
(golden, hw)@(4, 4, 5): (144.000000, 0.000000)
(golden, hw)@(4, 4, 6): (144.000000, 0.000000)
(golden, hw)@(4, 4, 7): (144.000000, 0.000000)
(golden, hw)@(4, 5, 0): (144.000000, 0.000000)
(golden, hw)@(4, 5, 1): (144.000000, 0.000000)
(golden, hw)@(4, 5, 2): (144.000000, 0.000000)
(golden, hw)@(4, 5, 3): (144.000000, 0.000000)
(golden, hw)@(4, 5, 4): (144.000000, 0.000000)
(golden, hw)@(4, 5, 5): (144.000000, 0.000000)
(golden, hw)@(4, 5, 6): (144.000000, 0.000000)
(golden, hw)@(4, 5, 7): (144.000000, 0.000000)
(golden, hw)@(4, 6, 0): (144.000000, 0.000000)
(golden, hw)@(4, 6, 1): (144.000000, 0.000000)
(golden, hw)@(4, 6, 2): (144.000000, 0.000000)
(golden, hw)@(4, 6, 3): (144.000000, 0.000000)
(golden, hw)@(4, 6, 4): (144.000000, 0.000000)
(golden, hw)@(4, 6, 5): (144.000000, 0.000000)
(golden, hw)@(4, 6, 6): (144.000000, 0.000000)
(golden, hw)@(4, 6, 7): (144.000000, 0.000000)
(golden, hw)@(4, 7, 0): (144.000000, 0.000000)
(golden, hw)@(4, 7, 1): (144.000000, 0.000000)
(golden, hw)@(4, 7, 2): (144.000000, 0.000000)
(golden, hw)@(4, 7, 3): (144.000000, 0.000000)
(golden, hw)@(4, 7, 4): (144.000000, 0.000000)
(golden, hw)@(4, 7, 5): (144.000000, 0.000000)
(golden, hw)@(4, 7, 6): (144.000000, 0.000000)
(golden, hw)@(4, 7, 7): (144.000000, 0.000000)
(golden, hw)@(5, 0, 0): (225.000000, 45.000000)
(golden, hw)@(5, 0, 1): (225.000000, 45.000000)
(golden, hw)@(5, 0, 2): (225.000000, 45.000000)
(golden, hw)@(5, 0, 3): (225.000000, 45.000000)
(golden, hw)@(5, 0, 4): (225.000000, 45.000000)
(golden, hw)@(5, 0, 5): (225.000000, 45.000000)
(golden, hw)@(5, 0, 6): (225.000000, 45.000000)
(golden, hw)@(5, 0, 7): (225.000000, 45.000000)
(golden, hw)@(5, 1, 0): (225.000000, 45.000000)
(golden, hw)@(5, 1, 1): (225.000000, 45.000000)
(golden, hw)@(5, 1, 2): (225.000000, 45.000000)
(golden, hw)@(5, 1, 3): (225.000000, 45.000000)
(golden, hw)@(5, 1, 4): (225.000000, 45.000000)
(golden, hw)@(5, 1, 5): (225.000000, 45.000000)
(golden, hw)@(5, 1, 6): (225.000000, 45.000000)
(golden, hw)@(5, 1, 7): (225.000000, 45.000000)
(golden, hw)@(5, 2, 0): (225.000000, 45.000000)
(golden, hw)@(5, 2, 1): (225.000000, 45.000000)
(golden, hw)@(5, 2, 2): (225.000000, 45.000000)
(golden, hw)@(5, 2, 3): (225.000000, 45.000000)
(golden, hw)@(5, 2, 4): (225.000000, 45.000000)
(golden, hw)@(5, 2, 5): (225.000000, 45.000000)
(golden, hw)@(5, 2, 6): (225.000000, 45.000000)
(golden, hw)@(5, 2, 7): (225.000000, 45.000000)
(golden, hw)@(5, 3, 0): (225.000000, 45.000000)
(golden, hw)@(5, 3, 1): (225.000000, 45.000000)
(golden, hw)@(5, 3, 2): (225.000000, 45.000000)
(golden, hw)@(5, 3, 3): (225.000000, 45.000000)
(golden, hw)@(5, 3, 4): (225.000000, 45.000000)
(golden, hw)@(5, 3, 5): (225.000000, 45.000000)
(golden, hw)@(5, 3, 6): (225.000000, 45.000000)
(golden, hw)@(5, 3, 7): (225.000000, 45.000000)
(golden, hw)@(5, 4, 0): (225.000000, 45.000000)
(golden, hw)@(5, 4, 1): (225.000000, 45.000000)
(golden, hw)@(5, 4, 2): (225.000000, 45.000000)
(golden, hw)@(5, 4, 3): (225.000000, 45.000000)
(golden, hw)@(5, 4, 4): (225.000000, 45.000000)
(golden, hw)@(5, 4, 5): (225.000000, 45.000000)
(golden, hw)@(5, 4, 6): (225.000000, 45.000000)
(golden, hw)@(5, 4, 7): (225.000000, 45.000000)
(golden, hw)@(5, 5, 0): (225.000000, 45.000000)
(golden, hw)@(5, 5, 1): (225.000000, 45.000000)
(golden, hw)@(5, 5, 2): (225.000000, 45.000000)
(golden, hw)@(5, 5, 3): (225.000000, 45.000000)
(golden, hw)@(5, 5, 4): (225.000000, 45.000000)
(golden, hw)@(5, 5, 5): (225.000000, 45.000000)
(golden, hw)@(5, 5, 6): (225.000000, 45.000000)
(golden, hw)@(5, 5, 7): (225.000000, 45.000000)
(golden, hw)@(5, 6, 0): (225.000000, 45.000000)
(golden, hw)@(5, 6, 1): (225.000000, 45.000000)
(golden, hw)@(5, 6, 2): (225.000000, 45.000000)
(golden, hw)@(5, 6, 3): (225.000000, 45.000000)
(golden, hw)@(5, 6, 4): (225.000000, 45.000000)
(golden, hw)@(5, 6, 5): (225.000000, 45.000000)
(golden, hw)@(5, 6, 6): (225.000000, 45.000000)
(golden, hw)@(5, 6, 7): (225.000000, 45.000000)
(golden, hw)@(5, 7, 0): (225.000000, 45.000000)
(golden, hw)@(5, 7, 1): (225.000000, 45.000000)
(golden, hw)@(5, 7, 2): (225.000000, 45.000000)
(golden, hw)@(5, 7, 3): (225.000000, 45.000000)
(golden, hw)@(5, 7, 4): (225.000000, 45.000000)
(golden, hw)@(5, 7, 5): (225.000000, 45.000000)
(golden, hw)@(5, 7, 6): (225.000000, 45.000000)
(golden, hw)@(5, 7, 7): (225.000000, 45.000000)
(golden, hw)@(6, 0, 0): (324.000000, 108.000000)
(golden, hw)@(6, 0, 1): (324.000000, 108.000000)
(golden, hw)@(6, 0, 2): (324.000000, 108.000000)
(golden, hw)@(6, 0, 3): (324.000000, 108.000000)
(golden, hw)@(6, 0, 4): (324.000000, 108.000000)
(golden, hw)@(6, 0, 5): (324.000000, 108.000000)
(golden, hw)@(6, 0, 6): (324.000000, 108.000000)
(golden, hw)@(6, 0, 7): (324.000000, 108.000000)
(golden, hw)@(6, 1, 0): (324.000000, 108.000000)
(golden, hw)@(6, 1, 1): (324.000000, 108.000000)
(golden, hw)@(6, 1, 2): (324.000000, 108.000000)
(golden, hw)@(6, 1, 3): (324.000000, 108.000000)
(golden, hw)@(6, 1, 4): (324.000000, 108.000000)
(golden, hw)@(6, 1, 5): (324.000000, 108.000000)
(golden, hw)@(6, 1, 6): (324.000000, 108.000000)
(golden, hw)@(6, 1, 7): (324.000000, 108.000000)
(golden, hw)@(6, 2, 0): (324.000000, 108.000000)
(golden, hw)@(6, 2, 1): (324.000000, 108.000000)
(golden, hw)@(6, 2, 2): (324.000000, 108.000000)
(golden, hw)@(6, 2, 3): (324.000000, 108.000000)
(golden, hw)@(6, 2, 4): (324.000000, 108.000000)
(golden, hw)@(6, 2, 5): (324.000000, 108.000000)
(golden, hw)@(6, 2, 6): (324.000000, 108.000000)
(golden, hw)@(6, 2, 7): (324.000000, 108.000000)
(golden, hw)@(6, 3, 0): (324.000000, 108.000000)
(golden, hw)@(6, 3, 1): (324.000000, 108.000000)
(golden, hw)@(6, 3, 2): (324.000000, 108.000000)
(golden, hw)@(6, 3, 3): (324.000000, 108.000000)
(golden, hw)@(6, 3, 4): (324.000000, 108.000000)
(golden, hw)@(6, 3, 5): (324.000000, 108.000000)
(golden, hw)@(6, 3, 6): (324.000000, 108.000000)
(golden, hw)@(6, 3, 7): (324.000000, 108.000000)
(golden, hw)@(6, 4, 0): (324.000000, 108.000000)
(golden, hw)@(6, 4, 1): (324.000000, 108.000000)
(golden, hw)@(6, 4, 2): (324.000000, 108.000000)
(golden, hw)@(6, 4, 3): (324.000000, 108.000000)
(golden, hw)@(6, 4, 4): (324.000000, 108.000000)
(golden, hw)@(6, 4, 5): (324.000000, 108.000000)
(golden, hw)@(6, 4, 6): (324.000000, 108.000000)
(golden, hw)@(6, 4, 7): (324.000000, 108.000000)
(golden, hw)@(6, 5, 0): (324.000000, 108.000000)
(golden, hw)@(6, 5, 1): (324.000000, 108.000000)
(golden, hw)@(6, 5, 2): (324.000000, 108.000000)
(golden, hw)@(6, 5, 3): (324.000000, 108.000000)
(golden, hw)@(6, 5, 4): (324.000000, 108.000000)
(golden, hw)@(6, 5, 5): (324.000000, 108.000000)
(golden, hw)@(6, 5, 6): (324.000000, 108.000000)
(golden, hw)@(6, 5, 7): (324.000000, 108.000000)
(golden, hw)@(6, 6, 0): (324.000000, 108.000000)
(golden, hw)@(6, 6, 1): (324.000000, 108.000000)
(golden, hw)@(6, 6, 2): (324.000000, 108.000000)
(golden, hw)@(6, 6, 3): (324.000000, 108.000000)
(golden, hw)@(6, 6, 4): (324.000000, 108.000000)
(golden, hw)@(6, 6, 5): (324.000000, 108.000000)
(golden, hw)@(6, 6, 6): (324.000000, 108.000000)
(golden, hw)@(6, 6, 7): (324.000000, 108.000000)
(golden, hw)@(6, 7, 0): (324.000000, 108.000000)
(golden, hw)@(6, 7, 1): (324.000000, 108.000000)
(golden, hw)@(6, 7, 2): (324.000000, 108.000000)
(golden, hw)@(6, 7, 3): (324.000000, 108.000000)
(golden, hw)@(6, 7, 4): (324.000000, 108.000000)
(golden, hw)@(6, 7, 5): (324.000000, 108.000000)
(golden, hw)@(6, 7, 6): (324.000000, 108.000000)
(golden, hw)@(6, 7, 7): (324.000000, 108.000000)
(golden, hw)@(7, 0, 0): (441.000000, 189.000000)
(golden, hw)@(7, 0, 1): (441.000000, 189.000000)
(golden, hw)@(7, 0, 2): (441.000000, 189.000000)
(golden, hw)@(7, 0, 3): (441.000000, 189.000000)
(golden, hw)@(7, 0, 4): (441.000000, 189.000000)
(golden, hw)@(7, 0, 5): (441.000000, 189.000000)
(golden, hw)@(7, 0, 6): (441.000000, 189.000000)
(golden, hw)@(7, 0, 7): (441.000000, 189.000000)
(golden, hw)@(7, 1, 0): (441.000000, 189.000000)
(golden, hw)@(7, 1, 1): (441.000000, 189.000000)
(golden, hw)@(7, 1, 2): (441.000000, 189.000000)
(golden, hw)@(7, 1, 3): (441.000000, 189.000000)
(golden, hw)@(7, 1, 4): (441.000000, 189.000000)
(golden, hw)@(7, 1, 5): (441.000000, 189.000000)
(golden, hw)@(7, 1, 6): (441.000000, 189.000000)
(golden, hw)@(7, 1, 7): (441.000000, 189.000000)
(golden, hw)@(7, 2, 0): (441.000000, 189.000000)
(golden, hw)@(7, 2, 1): (441.000000, 189.000000)
(golden, hw)@(7, 2, 2): (441.000000, 189.000000)
(golden, hw)@(7, 2, 3): (441.000000, 189.000000)
(golden, hw)@(7, 2, 4): (441.000000, 189.000000)
(golden, hw)@(7, 2, 5): (441.000000, 189.000000)
(golden, hw)@(7, 2, 6): (441.000000, 189.000000)
(golden, hw)@(7, 2, 7): (441.000000, 189.000000)
(golden, hw)@(7, 3, 0): (441.000000, 189.000000)
(golden, hw)@(7, 3, 1): (441.000000, 189.000000)
(golden, hw)@(7, 3, 2): (441.000000, 189.000000)
(golden, hw)@(7, 3, 3): (441.000000, 189.000000)
(golden, hw)@(7, 3, 4): (441.000000, 189.000000)
(golden, hw)@(7, 3, 5): (441.000000, 189.000000)
(golden, hw)@(7, 3, 6): (441.000000, 189.000000)
(golden, hw)@(7, 3, 7): (441.000000, 189.000000)
(golden, hw)@(7, 4, 0): (441.000000, 189.000000)
(golden, hw)@(7, 4, 1): (441.000000, 189.000000)
(golden, hw)@(7, 4, 2): (441.000000, 189.000000)
(golden, hw)@(7, 4, 3): (441.000000, 189.000000)
(golden, hw)@(7, 4, 4): (441.000000, 189.000000)
(golden, hw)@(7, 4, 5): (441.000000, 189.000000)
(golden, hw)@(7, 4, 6): (441.000000, 189.000000)
(golden, hw)@(7, 4, 7): (441.000000, 189.000000)
(golden, hw)@(7, 5, 0): (441.000000, 189.000000)
(golden, hw)@(7, 5, 1): (441.000000, 189.000000)
(golden, hw)@(7, 5, 2): (441.000000, 189.000000)
(golden, hw)@(7, 5, 3): (441.000000, 189.000000)
(golden, hw)@(7, 5, 4): (441.000000, 189.000000)
(golden, hw)@(7, 5, 5): (441.000000, 189.000000)
(golden, hw)@(7, 5, 6): (441.000000, 189.000000)
(golden, hw)@(7, 5, 7): (441.000000, 189.000000)
(golden, hw)@(7, 6, 0): (441.000000, 189.000000)
(golden, hw)@(7, 6, 1): (441.000000, 189.000000)
(golden, hw)@(7, 6, 2): (441.000000, 189.000000)
(golden, hw)@(7, 6, 3): (441.000000, 189.000000)
(golden, hw)@(7, 6, 4): (441.000000, 189.000000)
(golden, hw)@(7, 6, 5): (441.000000, 189.000000)
(golden, hw)@(7, 6, 6): (441.000000, 189.000000)
(golden, hw)@(7, 6, 7): (441.000000, 189.000000)
(golden, hw)@(7, 7, 0): (441.000000, 189.000000)
(golden, hw)@(7, 7, 1): (441.000000, 189.000000)
(golden, hw)@(7, 7, 2): (441.000000, 189.000000)
(golden, hw)@(7, 7, 3): (441.000000, 189.000000)
(golden, hw)@(7, 7, 4): (441.000000, 189.000000)
(golden, hw)@(7, 7, 5): (441.000000, 189.000000)
(golden, hw)@(7, 7, 6): (441.000000, 189.000000)
(golden, hw)@(7, 7, 7): (441.000000, 189.000000)
(golden, hw)@(8, 0, 0): (576.000000, 0.000000)
(golden, hw)@(8, 0, 1): (576.000000, 0.000000)
(golden, hw)@(8, 0, 2): (576.000000, 0.000000)
(golden, hw)@(8, 0, 3): (576.000000, 0.000000)
(golden, hw)@(8, 0, 4): (576.000000, 0.000000)
(golden, hw)@(8, 0, 5): (576.000000, 0.000000)
(golden, hw)@(8, 0, 6): (576.000000, 0.000000)
(golden, hw)@(8, 0, 7): (576.000000, 0.000000)
(golden, hw)@(8, 1, 0): (576.000000, 0.000000)
(golden, hw)@(8, 1, 1): (576.000000, 0.000000)
(golden, hw)@(8, 1, 2): (576.000000, 0.000000)
(golden, hw)@(8, 1, 3): (576.000000, 0.000000)
(golden, hw)@(8, 1, 4): (576.000000, 0.000000)
(golden, hw)@(8, 1, 5): (576.000000, 0.000000)
(golden, hw)@(8, 1, 6): (576.000000, 0.000000)
(golden, hw)@(8, 1, 7): (576.000000, 0.000000)
(golden, hw)@(8, 2, 0): (576.000000, 0.000000)
(golden, hw)@(8, 2, 1): (576.000000, 0.000000)
(golden, hw)@(8, 2, 2): (576.000000, 0.000000)
(golden, hw)@(8, 2, 3): (576.000000, 0.000000)
(golden, hw)@(8, 2, 4): (576.000000, 0.000000)
(golden, hw)@(8, 2, 5): (576.000000, 0.000000)
(golden, hw)@(8, 2, 6): (576.000000, 0.000000)
(golden, hw)@(8, 2, 7): (576.000000, 0.000000)
(golden, hw)@(8, 3, 0): (576.000000, 0.000000)
(golden, hw)@(8, 3, 1): (576.000000, 0.000000)
(golden, hw)@(8, 3, 2): (576.000000, 0.000000)
(golden, hw)@(8, 3, 3): (576.000000, 0.000000)
(golden, hw)@(8, 3, 4): (576.000000, 0.000000)
(golden, hw)@(8, 3, 5): (576.000000, 0.000000)
(golden, hw)@(8, 3, 6): (576.000000, 0.000000)
(golden, hw)@(8, 3, 7): (576.000000, 0.000000)
(golden, hw)@(8, 4, 0): (576.000000, 0.000000)
(golden, hw)@(8, 4, 1): (576.000000, 0.000000)
(golden, hw)@(8, 4, 2): (576.000000, 0.000000)
(golden, hw)@(8, 4, 3): (576.000000, 0.000000)
(golden, hw)@(8, 4, 4): (576.000000, 0.000000)
(golden, hw)@(8, 4, 5): (576.000000, 0.000000)
(golden, hw)@(8, 4, 6): (576.000000, 0.000000)
(golden, hw)@(8, 4, 7): (576.000000, 0.000000)
(golden, hw)@(8, 5, 0): (576.000000, 0.000000)
(golden, hw)@(8, 5, 1): (576.000000, 0.000000)
(golden, hw)@(8, 5, 2): (576.000000, 0.000000)
(golden, hw)@(8, 5, 3): (576.000000, 0.000000)
(golden, hw)@(8, 5, 4): (576.000000, 0.000000)
(golden, hw)@(8, 5, 5): (576.000000, 0.000000)
(golden, hw)@(8, 5, 6): (576.000000, 0.000000)
(golden, hw)@(8, 5, 7): (576.000000, 0.000000)
(golden, hw)@(8, 6, 0): (576.000000, 0.000000)
(golden, hw)@(8, 6, 1): (576.000000, 0.000000)
(golden, hw)@(8, 6, 2): (576.000000, 0.000000)
(golden, hw)@(8, 6, 3): (576.000000, 0.000000)
(golden, hw)@(8, 6, 4): (576.000000, 0.000000)
(golden, hw)@(8, 6, 5): (576.000000, 0.000000)
(golden, hw)@(8, 6, 6): (576.000000, 0.000000)
(golden, hw)@(8, 6, 7): (576.000000, 0.000000)
(golden, hw)@(8, 7, 0): (576.000000, 0.000000)
(golden, hw)@(8, 7, 1): (576.000000, 0.000000)
(golden, hw)@(8, 7, 2): (576.000000, 0.000000)
(golden, hw)@(8, 7, 3): (576.000000, 0.000000)
(golden, hw)@(8, 7, 4): (576.000000, 0.000000)
(golden, hw)@(8, 7, 5): (576.000000, 0.000000)
(golden, hw)@(8, 7, 6): (576.000000, 0.000000)
(golden, hw)@(8, 7, 7): (576.000000, 0.000000)
(golden, hw)@(9, 0, 0): (729.000000, 81.000000)
(golden, hw)@(9, 0, 1): (729.000000, 81.000000)
(golden, hw)@(9, 0, 2): (729.000000, 81.000000)
(golden, hw)@(9, 0, 3): (729.000000, 81.000000)
(golden, hw)@(9, 0, 4): (729.000000, 81.000000)
(golden, hw)@(9, 0, 5): (729.000000, 81.000000)
(golden, hw)@(9, 0, 6): (729.000000, 81.000000)
(golden, hw)@(9, 0, 7): (729.000000, 81.000000)
(golden, hw)@(9, 1, 0): (729.000000, 81.000000)
(golden, hw)@(9, 1, 1): (729.000000, 81.000000)
(golden, hw)@(9, 1, 2): (729.000000, 81.000000)
(golden, hw)@(9, 1, 3): (729.000000, 81.000000)
(golden, hw)@(9, 1, 4): (729.000000, 81.000000)
(golden, hw)@(9, 1, 5): (729.000000, 81.000000)
(golden, hw)@(9, 1, 6): (729.000000, 81.000000)
(golden, hw)@(9, 1, 7): (729.000000, 81.000000)
(golden, hw)@(9, 2, 0): (729.000000, 81.000000)
(golden, hw)@(9, 2, 1): (729.000000, 81.000000)
(golden, hw)@(9, 2, 2): (729.000000, 81.000000)
(golden, hw)@(9, 2, 3): (729.000000, 81.000000)
(golden, hw)@(9, 2, 4): (729.000000, 81.000000)
(golden, hw)@(9, 2, 5): (729.000000, 81.000000)
(golden, hw)@(9, 2, 6): (729.000000, 81.000000)
(golden, hw)@(9, 2, 7): (729.000000, 81.000000)
(golden, hw)@(9, 3, 0): (729.000000, 81.000000)
(golden, hw)@(9, 3, 1): (729.000000, 81.000000)
(golden, hw)@(9, 3, 2): (729.000000, 81.000000)
(golden, hw)@(9, 3, 3): (729.000000, 81.000000)
(golden, hw)@(9, 3, 4): (729.000000, 81.000000)
(golden, hw)@(9, 3, 5): (729.000000, 81.000000)
(golden, hw)@(9, 3, 6): (729.000000, 81.000000)
(golden, hw)@(9, 3, 7): (729.000000, 81.000000)
(golden, hw)@(9, 4, 0): (729.000000, 81.000000)
(golden, hw)@(9, 4, 1): (729.000000, 81.000000)
(golden, hw)@(9, 4, 2): (729.000000, 81.000000)
(golden, hw)@(9, 4, 3): (729.000000, 81.000000)
(golden, hw)@(9, 4, 4): (729.000000, 81.000000)
(golden, hw)@(9, 4, 5): (729.000000, 81.000000)
(golden, hw)@(9, 4, 6): (729.000000, 81.000000)
(golden, hw)@(9, 4, 7): (729.000000, 81.000000)
(golden, hw)@(9, 5, 0): (729.000000, 81.000000)
(golden, hw)@(9, 5, 1): (729.000000, 81.000000)
(golden, hw)@(9, 5, 2): (729.000000, 81.000000)
(golden, hw)@(9, 5, 3): (729.000000, 81.000000)
(golden, hw)@(9, 5, 4): (729.000000, 81.000000)
(golden, hw)@(9, 5, 5): (729.000000, 81.000000)
(golden, hw)@(9, 5, 6): (729.000000, 81.000000)
(golden, hw)@(9, 5, 7): (729.000000, 81.000000)
(golden, hw)@(9, 6, 0): (729.000000, 81.000000)
(golden, hw)@(9, 6, 1): (729.000000, 81.000000)
(golden, hw)@(9, 6, 2): (729.000000, 81.000000)
(golden, hw)@(9, 6, 3): (729.000000, 81.000000)
(golden, hw)@(9, 6, 4): (729.000000, 81.000000)
(golden, hw)@(9, 6, 5): (729.000000, 81.000000)
(golden, hw)@(9, 6, 6): (729.000000, 81.000000)
(golden, hw)@(9, 6, 7): (729.000000, 81.000000)
(golden, hw)@(9, 7, 0): (729.000000, 81.000000)
(golden, hw)@(9, 7, 1): (729.000000, 81.000000)
(golden, hw)@(9, 7, 2): (729.000000, 81.000000)
(golden, hw)@(9, 7, 3): (729.000000, 81.000000)
(golden, hw)@(9, 7, 4): (729.000000, 81.000000)
(golden, hw)@(9, 7, 5): (729.000000, 81.000000)
(golden, hw)@(9, 7, 6): (729.000000, 81.000000)
(golden, hw)@(9, 7, 7): (729.000000, 81.000000)
(golden, hw)@(10, 0, 0): (900.000000, 180.000000)
(golden, hw)@(10, 0, 1): (900.000000, 180.000000)
(golden, hw)@(10, 0, 2): (900.000000, 180.000000)
(golden, hw)@(10, 0, 3): (900.000000, 180.000000)
(golden, hw)@(10, 0, 4): (900.000000, 180.000000)
(golden, hw)@(10, 0, 5): (900.000000, 180.000000)
(golden, hw)@(10, 0, 6): (900.000000, 180.000000)
(golden, hw)@(10, 0, 7): (900.000000, 180.000000)
(golden, hw)@(10, 1, 0): (900.000000, 180.000000)
(golden, hw)@(10, 1, 1): (900.000000, 180.000000)
(golden, hw)@(10, 1, 2): (900.000000, 180.000000)
(golden, hw)@(10, 1, 3): (900.000000, 180.000000)
(golden, hw)@(10, 1, 4): (900.000000, 180.000000)
(golden, hw)@(10, 1, 5): (900.000000, 180.000000)
(golden, hw)@(10, 1, 6): (900.000000, 180.000000)
(golden, hw)@(10, 1, 7): (900.000000, 180.000000)
(golden, hw)@(10, 2, 0): (900.000000, 180.000000)
(golden, hw)@(10, 2, 1): (900.000000, 180.000000)
(golden, hw)@(10, 2, 2): (900.000000, 180.000000)
(golden, hw)@(10, 2, 3): (900.000000, 180.000000)
(golden, hw)@(10, 2, 4): (900.000000, 180.000000)
(golden, hw)@(10, 2, 5): (900.000000, 180.000000)
(golden, hw)@(10, 2, 6): (900.000000, 180.000000)
(golden, hw)@(10, 2, 7): (900.000000, 180.000000)
(golden, hw)@(10, 3, 0): (900.000000, 180.000000)
(golden, hw)@(10, 3, 1): (900.000000, 180.000000)
(golden, hw)@(10, 3, 2): (900.000000, 180.000000)
(golden, hw)@(10, 3, 3): (900.000000, 180.000000)
(golden, hw)@(10, 3, 4): (900.000000, 180.000000)
(golden, hw)@(10, 3, 5): (900.000000, 180.000000)
(golden, hw)@(10, 3, 6): (900.000000, 180.000000)
(golden, hw)@(10, 3, 7): (900.000000, 180.000000)
(golden, hw)@(10, 4, 0): (900.000000, 180.000000)
(golden, hw)@(10, 4, 1): (900.000000, 180.000000)
(golden, hw)@(10, 4, 2): (900.000000, 180.000000)
(golden, hw)@(10, 4, 3): (900.000000, 180.000000)
(golden, hw)@(10, 4, 4): (900.000000, 180.000000)
(golden, hw)@(10, 4, 5): (900.000000, 180.000000)
(golden, hw)@(10, 4, 6): (900.000000, 180.000000)
(golden, hw)@(10, 4, 7): (900.000000, 180.000000)
(golden, hw)@(10, 5, 0): (900.000000, 180.000000)
(golden, hw)@(10, 5, 1): (900.000000, 180.000000)
(golden, hw)@(10, 5, 2): (900.000000, 180.000000)
(golden, hw)@(10, 5, 3): (900.000000, 180.000000)
(golden, hw)@(10, 5, 4): (900.000000, 180.000000)
(golden, hw)@(10, 5, 5): (900.000000, 180.000000)
(golden, hw)@(10, 5, 6): (900.000000, 180.000000)
(golden, hw)@(10, 5, 7): (900.000000, 180.000000)
(golden, hw)@(10, 6, 0): (900.000000, 180.000000)
(golden, hw)@(10, 6, 1): (900.000000, 180.000000)
(golden, hw)@(10, 6, 2): (900.000000, 180.000000)
(golden, hw)@(10, 6, 3): (900.000000, 180.000000)
(golden, hw)@(10, 6, 4): (900.000000, 180.000000)
(golden, hw)@(10, 6, 5): (900.000000, 180.000000)
(golden, hw)@(10, 6, 6): (900.000000, 180.000000)
(golden, hw)@(10, 6, 7): (900.000000, 180.000000)
(golden, hw)@(10, 7, 0): (900.000000, 180.000000)
(golden, hw)@(10, 7, 1): (900.000000, 180.000000)
(golden, hw)@(10, 7, 2): (900.000000, 180.000000)
(golden, hw)@(10, 7, 3): (900.000000, 180.000000)
(golden, hw)@(10, 7, 4): (900.000000, 180.000000)
(golden, hw)@(10, 7, 5): (900.000000, 180.000000)
(golden, hw)@(10, 7, 6): (900.000000, 180.000000)
(golden, hw)@(10, 7, 7): (900.000000, 180.000000)
(golden, hw)@(11, 0, 0): (1089.000000, 297.000000)
(golden, hw)@(11, 0, 1): (1089.000000, 297.000000)
(golden, hw)@(11, 0, 2): (1089.000000, 297.000000)
(golden, hw)@(11, 0, 3): (1089.000000, 297.000000)
(golden, hw)@(11, 0, 4): (1089.000000, 297.000000)
(golden, hw)@(11, 0, 5): (1089.000000, 297.000000)
(golden, hw)@(11, 0, 6): (1089.000000, 297.000000)
(golden, hw)@(11, 0, 7): (1089.000000, 297.000000)
(golden, hw)@(11, 1, 0): (1089.000000, 297.000000)
(golden, hw)@(11, 1, 1): (1089.000000, 297.000000)
(golden, hw)@(11, 1, 2): (1089.000000, 297.000000)
(golden, hw)@(11, 1, 3): (1089.000000, 297.000000)
(golden, hw)@(11, 1, 4): (1089.000000, 297.000000)
(golden, hw)@(11, 1, 5): (1089.000000, 297.000000)
(golden, hw)@(11, 1, 6): (1089.000000, 297.000000)
(golden, hw)@(11, 1, 7): (1089.000000, 297.000000)
(golden, hw)@(11, 2, 0): (1089.000000, 297.000000)
(golden, hw)@(11, 2, 1): (1089.000000, 297.000000)
(golden, hw)@(11, 2, 2): (1089.000000, 297.000000)
(golden, hw)@(11, 2, 3): (1089.000000, 297.000000)
(golden, hw)@(11, 2, 4): (1089.000000, 297.000000)
(golden, hw)@(11, 2, 5): (1089.000000, 297.000000)
(golden, hw)@(11, 2, 6): (1089.000000, 297.000000)
(golden, hw)@(11, 2, 7): (1089.000000, 297.000000)
(golden, hw)@(11, 3, 0): (1089.000000, 297.000000)
(golden, hw)@(11, 3, 1): (1089.000000, 297.000000)
(golden, hw)@(11, 3, 2): (1089.000000, 297.000000)
(golden, hw)@(11, 3, 3): (1089.000000, 297.000000)
(golden, hw)@(11, 3, 4): (1089.000000, 297.000000)
(golden, hw)@(11, 3, 5): (1089.000000, 297.000000)
(golden, hw)@(11, 3, 6): (1089.000000, 297.000000)
(golden, hw)@(11, 3, 7): (1089.000000, 297.000000)
(golden, hw)@(11, 4, 0): (1089.000000, 297.000000)
(golden, hw)@(11, 4, 1): (1089.000000, 297.000000)
(golden, hw)@(11, 4, 2): (1089.000000, 297.000000)
(golden, hw)@(11, 4, 3): (1089.000000, 297.000000)
(golden, hw)@(11, 4, 4): (1089.000000, 297.000000)
(golden, hw)@(11, 4, 5): (1089.000000, 297.000000)
(golden, hw)@(11, 4, 6): (1089.000000, 297.000000)
(golden, hw)@(11, 4, 7): (1089.000000, 297.000000)
(golden, hw)@(11, 5, 0): (1089.000000, 297.000000)
(golden, hw)@(11, 5, 1): (1089.000000, 297.000000)
(golden, hw)@(11, 5, 2): (1089.000000, 297.000000)
(golden, hw)@(11, 5, 3): (1089.000000, 297.000000)
(golden, hw)@(11, 5, 4): (1089.000000, 297.000000)
(golden, hw)@(11, 5, 5): (1089.000000, 297.000000)
(golden, hw)@(11, 5, 6): (1089.000000, 297.000000)
(golden, hw)@(11, 5, 7): (1089.000000, 297.000000)
(golden, hw)@(11, 6, 0): (1089.000000, 297.000000)
(golden, hw)@(11, 6, 1): (1089.000000, 297.000000)
(golden, hw)@(11, 6, 2): (1089.000000, 297.000000)
(golden, hw)@(11, 6, 3): (1089.000000, 297.000000)
(golden, hw)@(11, 6, 4): (1089.000000, 297.000000)
(golden, hw)@(11, 6, 5): (1089.000000, 297.000000)
(golden, hw)@(11, 6, 6): (1089.000000, 297.000000)
(golden, hw)@(11, 6, 7): (1089.000000, 297.000000)
(golden, hw)@(11, 7, 0): (1089.000000, 297.000000)
(golden, hw)@(11, 7, 1): (1089.000000, 297.000000)
(golden, hw)@(11, 7, 2): (1089.000000, 297.000000)
(golden, hw)@(11, 7, 3): (1089.000000, 297.000000)
(golden, hw)@(11, 7, 4): (1089.000000, 297.000000)
(golden, hw)@(11, 7, 5): (1089.000000, 297.000000)
(golden, hw)@(11, 7, 6): (1089.000000, 297.000000)
(golden, hw)@(11, 7, 7): (1089.000000, 297.000000)
(golden, hw)@(12, 0, 0): (1296.000000, 0.000000)
(golden, hw)@(12, 0, 1): (1296.000000, 0.000000)
(golden, hw)@(12, 0, 2): (1296.000000, 0.000000)
(golden, hw)@(12, 0, 3): (1296.000000, 0.000000)
(golden, hw)@(12, 0, 4): (1296.000000, 0.000000)
(golden, hw)@(12, 0, 5): (1296.000000, 0.000000)
(golden, hw)@(12, 0, 6): (1296.000000, 0.000000)
(golden, hw)@(12, 0, 7): (1296.000000, 0.000000)
(golden, hw)@(12, 1, 0): (1296.000000, 0.000000)
(golden, hw)@(12, 1, 1): (1296.000000, 0.000000)
(golden, hw)@(12, 1, 2): (1296.000000, 0.000000)
(golden, hw)@(12, 1, 3): (1296.000000, 0.000000)
(golden, hw)@(12, 1, 4): (1296.000000, 0.000000)
(golden, hw)@(12, 1, 5): (1296.000000, 0.000000)
(golden, hw)@(12, 1, 6): (1296.000000, 0.000000)
(golden, hw)@(12, 1, 7): (1296.000000, 0.000000)
(golden, hw)@(12, 2, 0): (1296.000000, 0.000000)
(golden, hw)@(12, 2, 1): (1296.000000, 0.000000)
(golden, hw)@(12, 2, 2): (1296.000000, 0.000000)
(golden, hw)@(12, 2, 3): (1296.000000, 0.000000)
(golden, hw)@(12, 2, 4): (1296.000000, 0.000000)
(golden, hw)@(12, 2, 5): (1296.000000, 0.000000)
(golden, hw)@(12, 2, 6): (1296.000000, 0.000000)
(golden, hw)@(12, 2, 7): (1296.000000, 0.000000)
(golden, hw)@(12, 3, 0): (1296.000000, 0.000000)
(golden, hw)@(12, 3, 1): (1296.000000, 0.000000)
(golden, hw)@(12, 3, 2): (1296.000000, 0.000000)
(golden, hw)@(12, 3, 3): (1296.000000, 0.000000)
(golden, hw)@(12, 3, 4): (1296.000000, 0.000000)
(golden, hw)@(12, 3, 5): (1296.000000, 0.000000)
(golden, hw)@(12, 3, 6): (1296.000000, 0.000000)
(golden, hw)@(12, 3, 7): (1296.000000, 0.000000)
(golden, hw)@(12, 4, 0): (1296.000000, 0.000000)
(golden, hw)@(12, 4, 1): (1296.000000, 0.000000)
(golden, hw)@(12, 4, 2): (1296.000000, 0.000000)
(golden, hw)@(12, 4, 3): (1296.000000, 0.000000)
(golden, hw)@(12, 4, 4): (1296.000000, 0.000000)
(golden, hw)@(12, 4, 5): (1296.000000, 0.000000)
(golden, hw)@(12, 4, 6): (1296.000000, 0.000000)
(golden, hw)@(12, 4, 7): (1296.000000, 0.000000)
(golden, hw)@(12, 5, 0): (1296.000000, 0.000000)
(golden, hw)@(12, 5, 1): (1296.000000, 0.000000)
(golden, hw)@(12, 5, 2): (1296.000000, 0.000000)
(golden, hw)@(12, 5, 3): (1296.000000, 0.000000)
(golden, hw)@(12, 5, 4): (1296.000000, 0.000000)
(golden, hw)@(12, 5, 5): (1296.000000, 0.000000)
(golden, hw)@(12, 5, 6): (1296.000000, 0.000000)
(golden, hw)@(12, 5, 7): (1296.000000, 0.000000)
(golden, hw)@(12, 6, 0): (1296.000000, 0.000000)
(golden, hw)@(12, 6, 1): (1296.000000, 0.000000)
(golden, hw)@(12, 6, 2): (1296.000000, 0.000000)
(golden, hw)@(12, 6, 3): (1296.000000, 0.000000)
(golden, hw)@(12, 6, 4): (1296.000000, 0.000000)
(golden, hw)@(12, 6, 5): (1296.000000, 0.000000)
(golden, hw)@(12, 6, 6): (1296.000000, 0.000000)
(golden, hw)@(12, 6, 7): (1296.000000, 0.000000)
(golden, hw)@(12, 7, 0): (1296.000000, 0.000000)
(golden, hw)@(12, 7, 1): (1296.000000, 0.000000)
(golden, hw)@(12, 7, 2): (1296.000000, 0.000000)
(golden, hw)@(12, 7, 3): (1296.000000, 0.000000)
(golden, hw)@(12, 7, 4): (1296.000000, 0.000000)
(golden, hw)@(12, 7, 5): (1296.000000, 0.000000)
(golden, hw)@(12, 7, 6): (1296.000000, 0.000000)
(golden, hw)@(12, 7, 7): (1296.000000, 0.000000)
(golden, hw)@(13, 0, 0): (1521.000000, 117.000000)
(golden, hw)@(13, 0, 1): (1521.000000, 117.000000)
(golden, hw)@(13, 0, 2): (1521.000000, 117.000000)
(golden, hw)@(13, 0, 3): (1521.000000, 117.000000)
(golden, hw)@(13, 0, 4): (1521.000000, 117.000000)
(golden, hw)@(13, 0, 5): (1521.000000, 117.000000)
(golden, hw)@(13, 0, 6): (1521.000000, 117.000000)
(golden, hw)@(13, 0, 7): (1521.000000, 117.000000)
(golden, hw)@(13, 1, 0): (1521.000000, 117.000000)
(golden, hw)@(13, 1, 1): (1521.000000, 117.000000)
(golden, hw)@(13, 1, 2): (1521.000000, 117.000000)
(golden, hw)@(13, 1, 3): (1521.000000, 117.000000)
(golden, hw)@(13, 1, 4): (1521.000000, 117.000000)
(golden, hw)@(13, 1, 5): (1521.000000, 117.000000)
(golden, hw)@(13, 1, 6): (1521.000000, 117.000000)
(golden, hw)@(13, 1, 7): (1521.000000, 117.000000)
(golden, hw)@(13, 2, 0): (1521.000000, 117.000000)
(golden, hw)@(13, 2, 1): (1521.000000, 117.000000)
(golden, hw)@(13, 2, 2): (1521.000000, 117.000000)
(golden, hw)@(13, 2, 3): (1521.000000, 117.000000)
(golden, hw)@(13, 2, 4): (1521.000000, 117.000000)
(golden, hw)@(13, 2, 5): (1521.000000, 117.000000)
(golden, hw)@(13, 2, 6): (1521.000000, 117.000000)
(golden, hw)@(13, 2, 7): (1521.000000, 117.000000)
(golden, hw)@(13, 3, 0): (1521.000000, 117.000000)
(golden, hw)@(13, 3, 1): (1521.000000, 117.000000)
(golden, hw)@(13, 3, 2): (1521.000000, 117.000000)
(golden, hw)@(13, 3, 3): (1521.000000, 117.000000)
(golden, hw)@(13, 3, 4): (1521.000000, 117.000000)
(golden, hw)@(13, 3, 5): (1521.000000, 117.000000)
(golden, hw)@(13, 3, 6): (1521.000000, 117.000000)
(golden, hw)@(13, 3, 7): (1521.000000, 117.000000)
(golden, hw)@(13, 4, 0): (1521.000000, 117.000000)
(golden, hw)@(13, 4, 1): (1521.000000, 117.000000)
(golden, hw)@(13, 4, 2): (1521.000000, 117.000000)
(golden, hw)@(13, 4, 3): (1521.000000, 117.000000)
(golden, hw)@(13, 4, 4): (1521.000000, 117.000000)
(golden, hw)@(13, 4, 5): (1521.000000, 117.000000)
(golden, hw)@(13, 4, 6): (1521.000000, 117.000000)
(golden, hw)@(13, 4, 7): (1521.000000, 117.000000)
(golden, hw)@(13, 5, 0): (1521.000000, 117.000000)
(golden, hw)@(13, 5, 1): (1521.000000, 117.000000)
(golden, hw)@(13, 5, 2): (1521.000000, 117.000000)
(golden, hw)@(13, 5, 3): (1521.000000, 117.000000)
(golden, hw)@(13, 5, 4): (1521.000000, 117.000000)
(golden, hw)@(13, 5, 5): (1521.000000, 117.000000)
(golden, hw)@(13, 5, 6): (1521.000000, 117.000000)
(golden, hw)@(13, 5, 7): (1521.000000, 117.000000)
(golden, hw)@(13, 6, 0): (1521.000000, 117.000000)
(golden, hw)@(13, 6, 1): (1521.000000, 117.000000)
(golden, hw)@(13, 6, 2): (1521.000000, 117.000000)
(golden, hw)@(13, 6, 3): (1521.000000, 117.000000)
(golden, hw)@(13, 6, 4): (1521.000000, 117.000000)
(golden, hw)@(13, 6, 5): (1521.000000, 117.000000)
(golden, hw)@(13, 6, 6): (1521.000000, 117.000000)
(golden, hw)@(13, 6, 7): (1521.000000, 117.000000)
(golden, hw)@(13, 7, 0): (1521.000000, 117.000000)
(golden, hw)@(13, 7, 1): (1521.000000, 117.000000)
(golden, hw)@(13, 7, 2): (1521.000000, 117.000000)
(golden, hw)@(13, 7, 3): (1521.000000, 117.000000)
(golden, hw)@(13, 7, 4): (1521.000000, 117.000000)
(golden, hw)@(13, 7, 5): (1521.000000, 117.000000)
(golden, hw)@(13, 7, 6): (1521.000000, 117.000000)
(golden, hw)@(13, 7, 7): (1521.000000, 117.000000)
(golden, hw)@(14, 0, 0): (1764.000000, 252.000000)
(golden, hw)@(14, 0, 1): (1764.000000, 252.000000)
(golden, hw)@(14, 0, 2): (1764.000000, 252.000000)
(golden, hw)@(14, 0, 3): (1764.000000, 252.000000)
(golden, hw)@(14, 0, 4): (1764.000000, 252.000000)
(golden, hw)@(14, 0, 5): (1764.000000, 252.000000)
(golden, hw)@(14, 0, 6): (1764.000000, 252.000000)
(golden, hw)@(14, 0, 7): (1764.000000, 252.000000)
(golden, hw)@(14, 1, 0): (1764.000000, 252.000000)
(golden, hw)@(14, 1, 1): (1764.000000, 252.000000)
(golden, hw)@(14, 1, 2): (1764.000000, 252.000000)
(golden, hw)@(14, 1, 3): (1764.000000, 252.000000)
(golden, hw)@(14, 1, 4): (1764.000000, 252.000000)
(golden, hw)@(14, 1, 5): (1764.000000, 252.000000)
(golden, hw)@(14, 1, 6): (1764.000000, 252.000000)
(golden, hw)@(14, 1, 7): (1764.000000, 252.000000)
(golden, hw)@(14, 2, 0): (1764.000000, 252.000000)
(golden, hw)@(14, 2, 1): (1764.000000, 252.000000)
(golden, hw)@(14, 2, 2): (1764.000000, 252.000000)
(golden, hw)@(14, 2, 3): (1764.000000, 252.000000)
(golden, hw)@(14, 2, 4): (1764.000000, 252.000000)
(golden, hw)@(14, 2, 5): (1764.000000, 252.000000)
(golden, hw)@(14, 2, 6): (1764.000000, 252.000000)
(golden, hw)@(14, 2, 7): (1764.000000, 252.000000)
(golden, hw)@(14, 3, 0): (1764.000000, 252.000000)
(golden, hw)@(14, 3, 1): (1764.000000, 252.000000)
(golden, hw)@(14, 3, 2): (1764.000000, 252.000000)
(golden, hw)@(14, 3, 3): (1764.000000, 252.000000)
(golden, hw)@(14, 3, 4): (1764.000000, 252.000000)
(golden, hw)@(14, 3, 5): (1764.000000, 252.000000)
(golden, hw)@(14, 3, 6): (1764.000000, 252.000000)
(golden, hw)@(14, 3, 7): (1764.000000, 252.000000)
(golden, hw)@(14, 4, 0): (1764.000000, 252.000000)
(golden, hw)@(14, 4, 1): (1764.000000, 252.000000)
(golden, hw)@(14, 4, 2): (1764.000000, 252.000000)
(golden, hw)@(14, 4, 3): (1764.000000, 252.000000)
(golden, hw)@(14, 4, 4): (1764.000000, 252.000000)
(golden, hw)@(14, 4, 5): (1764.000000, 252.000000)
(golden, hw)@(14, 4, 6): (1764.000000, 252.000000)
(golden, hw)@(14, 4, 7): (1764.000000, 252.000000)
(golden, hw)@(14, 5, 0): (1764.000000, 252.000000)
(golden, hw)@(14, 5, 1): (1764.000000, 252.000000)
(golden, hw)@(14, 5, 2): (1764.000000, 252.000000)
(golden, hw)@(14, 5, 3): (1764.000000, 252.000000)
(golden, hw)@(14, 5, 4): (1764.000000, 252.000000)
(golden, hw)@(14, 5, 5): (1764.000000, 252.000000)
(golden, hw)@(14, 5, 6): (1764.000000, 252.000000)
(golden, hw)@(14, 5, 7): (1764.000000, 252.000000)
(golden, hw)@(14, 6, 0): (1764.000000, 252.000000)
(golden, hw)@(14, 6, 1): (1764.000000, 252.000000)
(golden, hw)@(14, 6, 2): (1764.000000, 252.000000)
(golden, hw)@(14, 6, 3): (1764.000000, 252.000000)
(golden, hw)@(14, 6, 4): (1764.000000, 252.000000)
(golden, hw)@(14, 6, 5): (1764.000000, 252.000000)
(golden, hw)@(14, 6, 6): (1764.000000, 252.000000)
(golden, hw)@(14, 6, 7): (1764.000000, 252.000000)
(golden, hw)@(14, 7, 0): (1764.000000, 252.000000)
(golden, hw)@(14, 7, 1): (1764.000000, 252.000000)
(golden, hw)@(14, 7, 2): (1764.000000, 252.000000)
(golden, hw)@(14, 7, 3): (1764.000000, 252.000000)
(golden, hw)@(14, 7, 4): (1764.000000, 252.000000)
(golden, hw)@(14, 7, 5): (1764.000000, 252.000000)
(golden, hw)@(14, 7, 6): (1764.000000, 252.000000)
(golden, hw)@(14, 7, 7): (1764.000000, 252.000000)
(golden, hw)@(15, 0, 0): (2025.000000, 405.000000)
(golden, hw)@(15, 0, 1): (2025.000000, 405.000000)
(golden, hw)@(15, 0, 2): (2025.000000, 405.000000)
(golden, hw)@(15, 0, 3): (2025.000000, 405.000000)
(golden, hw)@(15, 0, 4): (2025.000000, 405.000000)
(golden, hw)@(15, 0, 5): (2025.000000, 405.000000)
(golden, hw)@(15, 0, 6): (2025.000000, 405.000000)
(golden, hw)@(15, 0, 7): (2025.000000, 405.000000)
(golden, hw)@(15, 1, 0): (2025.000000, 405.000000)
(golden, hw)@(15, 1, 1): (2025.000000, 405.000000)
(golden, hw)@(15, 1, 2): (2025.000000, 405.000000)
(golden, hw)@(15, 1, 3): (2025.000000, 405.000000)
(golden, hw)@(15, 1, 4): (2025.000000, 405.000000)
(golden, hw)@(15, 1, 5): (2025.000000, 405.000000)
(golden, hw)@(15, 1, 6): (2025.000000, 405.000000)
(golden, hw)@(15, 1, 7): (2025.000000, 405.000000)
(golden, hw)@(15, 2, 0): (2025.000000, 405.000000)
(golden, hw)@(15, 2, 1): (2025.000000, 405.000000)
(golden, hw)@(15, 2, 2): (2025.000000, 405.000000)
(golden, hw)@(15, 2, 3): (2025.000000, 405.000000)
(golden, hw)@(15, 2, 4): (2025.000000, 405.000000)
(golden, hw)@(15, 2, 5): (2025.000000, 405.000000)
(golden, hw)@(15, 2, 6): (2025.000000, 405.000000)
(golden, hw)@(15, 2, 7): (2025.000000, 405.000000)
(golden, hw)@(15, 3, 0): (2025.000000, 405.000000)
(golden, hw)@(15, 3, 1): (2025.000000, 405.000000)
(golden, hw)@(15, 3, 2): (2025.000000, 405.000000)
(golden, hw)@(15, 3, 3): (2025.000000, 405.000000)
(golden, hw)@(15, 3, 4): (2025.000000, 405.000000)
(golden, hw)@(15, 3, 5): (2025.000000, 405.000000)
(golden, hw)@(15, 3, 6): (2025.000000, 405.000000)
(golden, hw)@(15, 3, 7): (2025.000000, 405.000000)
(golden, hw)@(15, 4, 0): (2025.000000, 405.000000)
(golden, hw)@(15, 4, 1): (2025.000000, 405.000000)
(golden, hw)@(15, 4, 2): (2025.000000, 405.000000)
(golden, hw)@(15, 4, 3): (2025.000000, 405.000000)
(golden, hw)@(15, 4, 4): (2025.000000, 405.000000)
(golden, hw)@(15, 4, 5): (2025.000000, 405.000000)
(golden, hw)@(15, 4, 6): (2025.000000, 405.000000)
(golden, hw)@(15, 4, 7): (2025.000000, 405.000000)
(golden, hw)@(15, 5, 0): (2025.000000, 405.000000)
(golden, hw)@(15, 5, 1): (2025.000000, 405.000000)
(golden, hw)@(15, 5, 2): (2025.000000, 405.000000)
(golden, hw)@(15, 5, 3): (2025.000000, 405.000000)
(golden, hw)@(15, 5, 4): (2025.000000, 405.000000)
(golden, hw)@(15, 5, 5): (2025.000000, 405.000000)
(golden, hw)@(15, 5, 6): (2025.000000, 405.000000)
(golden, hw)@(15, 5, 7): (2025.000000, 405.000000)
(golden, hw)@(15, 6, 0): (2025.000000, 405.000000)
(golden, hw)@(15, 6, 1): (2025.000000, 405.000000)
(golden, hw)@(15, 6, 2): (2025.000000, 405.000000)
(golden, hw)@(15, 6, 3): (2025.000000, 405.000000)
(golden, hw)@(15, 6, 4): (2025.000000, 405.000000)
(golden, hw)@(15, 6, 5): (2025.000000, 405.000000)
(golden, hw)@(15, 6, 6): (2025.000000, 405.000000)
(golden, hw)@(15, 6, 7): (2025.000000, 405.000000)
(golden, hw)@(15, 7, 0): (2025.000000, 405.000000)
(golden, hw)@(15, 7, 1): (2025.000000, 405.000000)
(golden, hw)@(15, 7, 2): (2025.000000, 405.000000)
(golden, hw)@(15, 7, 3): (2025.000000, 405.000000)
(golden, hw)@(15, 7, 4): (2025.000000, 405.000000)
(golden, hw)@(15, 7, 5): (2025.000000, 405.000000)
(golden, hw)@(15, 7, 6): (2025.000000, 405.000000)
(golden, hw)@(15, 7, 7): (2025.000000, 405.000000)
Test failed with 768 errors!
@E Simulation failed: Function 'main' returns nonzero value '255'.
ERROR: [SIM 211-100] 'csim_design' failed: nonzero return value.
INFO: [SIM 211-3] *************** CSIM finish ***************
4
    while executing
"source hls_script.tcl"
    ("uplevel" body line 1)
    invoked from within
"uplevel \#0 [list source $arg] "

INFO: [Common 17-206] Exiting vivado_hls at Mon Feb 14 16:26:03 2022...
`

A few issues in HCL-AutoSA integration

Hi,

Many thanks for your help before. We have a working demo with HCL-AutoSA integration now. The workflow is not fully automated right now. This issue is just to document what I have changed manually to make the flow work.

  • AutoSA generated HLS code run into deadlock if host (de)serialization option is turned off. So we should always keep that option on (However, serialization is not needed if the port connects to an on-chip memory. To make it work, I have to remove it manually). I tried to increase the FIFO depth (for the FIFOs inside AutoSA) a bit from 2 to 4, or even larger. Sometimes this would solve the deadlock issue, but not always.

  • When host serialization is turned on, some interface memory ports will be packed to bit-width not of 2's power. This will cause error in synthesis with Vitis.

  • The AutoSA generated code cannot be synthesized sometimes. Vitis complains that the ternary operands having ambiguous data types. To make it compliable, I need to add casting expressions manually to the macro.

// macro generated by AutoSA (trigger synthesis error)
#define min(x, y) x < y? x: y
// synthesizable version 
#define min(x, y) cast(x) < cast(y)? cast(x): cast(y)
  • The SA's output is computed tile by tile. If we want to connect two SAs, or connect SA with another function with FIFO interface, we have to make sure the tile size matches, or we need to insert intermediate buffer manually to ensure the data access order matches. This part should be done in the HCL side, but to do this, we will need some extra information from AutoSA.

Intel AOC backend: error: use of undeclared identifier 'data'

Here is the command I ran

./autosa /usr/local/docker/hcl_autosa_t
mp.c --config=./autosa_config/autosa_config.json --target=autosa_opencl --output-dir=./autos
a.tmp/output --sa-sizes="{kernel[]->space_time[3];kernel[]->array_part[32,32,512];kernel[]->
latency[8,8];kernel[]->simd[1]}" --simd-info=./autosa_tests/mm_hcl/simd_info.json --hls --hc
l --data-pack-sizes="{kernel[]->B[8,32,64];kernel[]->A[8,32,64];kernel[]->Y0[8,32,64]}"--no-
linearize-device-arrays --host-serialize

The generated OCL code is kind of problematic (data not declared)

void B_IO_L2_in_intra_trans_3(int c0, int c1, int c2, B_t8 local_B[8][64], bool intra_trans_en)
 {
  /* Variable Declaration */
  int p0 = 3; // module id
  /* Variable Declaration */

  if (!intra_trans_en) return;

  // io_L2
  // io_L1  // pe
  #pragma loop_coalesce 
  for (uint10_t c5 = 0; c5 <= 511; c5 += 1) {
    // latency    
    for (uint4_t c6 = 0; c6 <= 7; c6 += 1) {
      // latency
      for (uint4_t c7 = 0; c7 <= 7; c7 += 1) {
        // hls_pipeline        {
          B_t8 in_data;
          B_t1 out_data;
          in_data = local_B[c6][c5 / 8];          
          int split_idx = (c5) % 8;
          out_data = data.data[split_idx];
          write_channel_intel(fifo_B_PE_0_3, out_data);
        }
      }
    }  
  }
}

I will post the input C code to AutoSA later.

Large size MM input-stationary SA codegen issue

I am using the latest docker image. I want to create a input-stationary for large MM. Here is what I did

./autosa ./autosa_tests/large/mm/kernel.c --config=./autosa_config/autosa_config.json \
    --target=autosa_hls_c --output-dir=./autosa.tmp/output \
    --sa-sizes="{kernel[]->space_time[2];kernel[]->array_part[260,256,512];kernel[]->latency[20,16];kernel[]->simd[1]}" 
    --simd-info=./autosa_tests/large/mm/simd_info.json \
    --host-serialize --local-reduce --reduce-op="+" --simd-touch-space --no-isl-sink;

# Error in HLS synthesis
===>The following messages were generated while  performing high-level synthesis for kernel: kernel0 Log file: /scratch/users/sx233/FPGA-test/gemm.autosa/temp.autosa.large.mm/_x/kernel0.hw/kernel0/vitis_hls.log :
ERROR: [v++ 214-124] use of undeclared identifier 'fifo_C_1_serialize': /scratch/users/sx233/FPGA-test/gemm.autosa/temp.autosa.large.mm/src/kernel_kernel.cpp:931
ERROR: [v++ 60-300] Failed to build kernel(ip) kernel0, see log for details: /scratch/users/sx233/FPGA-test/gemm.autosa/temp.autosa.large.mm/_x/kernel0.hw/kernel0/vitis_hls.log

Also another question for the PE dimension of the input-stationary SA. For example, if I have a 1024x1024 MatMul kernel, the array part factor is set to [256,256,512], latency hiding factor is [32,32] and SIMD factor is 8. Since the reduction loop is selected as the space loop, I was expecting the SA size to be 512/8 = 64? but in the generated code I can only see 32 PEs. Is that the correct way for calculating the PE dimension for that?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.