// Original CPU teaching model; not a device simulator or benchmark.
#include <iostream>
#include <vector>
#include <stdexcept>

void require(bool ok) { if (!ok) throw std::runtime_error("model check failed"); }

int main() {
 std::vector<int> source(16),packed,restored(16);
 for(int i=0;i<16;++i) source[static_cast<std::size_t>(i)]=i;
 for(int tr=0;tr<2;++tr) for(int tc=0;tc<2;++tc)
  for(int r=0;r<2;++r) for(int c=0;c<2;++c)
   packed.push_back(source[static_cast<std::size_t>((tr*2+r)*4+tc*2+c)]);
 std::size_t k=0;
 for(int tr=0;tr<2;++tr) for(int tc=0;tc<2;++tc)
  for(int r=0;r<2;++r) for(int c=0;c<2;++c)
   restored[static_cast<std::size_t>((tr*2+r)*4+tc*2+c)]=packed[k++];
 require(source==restored);
 std::cout<<"first_tile="<<packed[0]<<' '<<packed[1]<<' '<<packed[2]<<' '<<packed[3]<<" roundtrip=ok\n";
}

