  This methodology paper addresses high-performance high-productivity
programming on spatial architectures. Spatial architectures are efficient for
executing dataflow algorithms, yet for high-performance programming, the
productivity is low and verification is painful. We show that coding and
verification are the biggest obstacle to the wide adoption of spatial
architectures. We propose a new programming methodology, T2S (Temporal to
Spatial), to remove this obstacle. A programmer specifies a temporal definition
and a spatial mapping. The temporal definition defines the functionality to
compute, while the spatial mapping defines how to decompose the functionality
and map the decomposed pieces onto a spatial architecture. The specification
precisely controls a compiler to actually implement the loop and data
transformations specified in the mapping. The specification is loop-nest- and
matrix-oriented, and thus lends itself to the compiler for automatic, static
verification. Many generic, strategic loop and data optimizations can be
systematically expressed. Consequently, high performance is expected with
substantially higher productivity: compared with high-performance programming
in today's high-level synthesis (HLS) languages or hardware description
languages (HDLs), the engineering effort on coding and verification is expected
to be reduced from months to hours, a reduction of 2 or 3 orders of magnitude.
