{
 "metadata": {
  "name": "",
  "signature": "sha256:c9f8334aa7aa4a5ad1437fa5871aafa52bbc9131271d9e90e7be47d22725cc94"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "# Loopy IPython Integration Demo"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%load_ext loopy.ipython_ext"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## Without transform code"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%fortran_kernel\n",
      "\n",
      "subroutine fill(out, a, n)\n",
      "  implicit none\n",
      "\n",
      "  real*8 a, out(n)\n",
      "  integer n, i\n",
      "\n",
      "  do i = 1, n\n",
      "    out(i) = a\n",
      "  end do\n",
      "end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 2
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print(fill)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "---------------------------------------------------------------------------\n",
        "KERNEL: fill\n",
        "---------------------------------------------------------------------------\n",
        "ARGUMENTS:\n",
        "a: ValueArg, type: float64\n",
        "n: ValueArg, type: int32\n",
        "out: GlobalArg, type: float64, shape: (n), dim_tags: (N0:stride:1)\n",
        "---------------------------------------------------------------------------\n",
        "DOMAINS:\n",
        "[n] -> { [i] : i >= 0 and i <= -1 + n }\n",
        "---------------------------------------------------------------------------\n",
        "INAME IMPLEMENTATION TAGS:\n",
        "i: None\n",
        "---------------------------------------------------------------------------\n",
        "INSTRUCTIONS:\n",
        "[i]                                  out[i] <- a   # insn0\n",
        "---------------------------------------------------------------------------\n"
       ]
      }
     ],
     "prompt_number": 3
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## With transform code"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "split_amount = 128"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 4
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%transformed_fortran_kernel\n",
      "\n",
      "subroutine tr_fill(out, a, n)\n",
      "  implicit none\n",
      "\n",
      "  real*8 a, out(n)\n",
      "  integer n, i\n",
      "\n",
      "  do i = 1, n\n",
      "    out(i) = a\n",
      "  end do\n",
      "end\n",
      "\n",
      "!$loopy begin\n",
      "!\n",
      "! tr_fill, = lp.parse_fortran(SOURCE)\n",
      "! tr_fill = lp.split_iname(tr_fill, \"i\", split_amount,\n",
      "!     outer_tag=\"g.0\", inner_tag=\"l.0\")\n",
      "! RESULT = [tr_fill]\n",
      "!\n",
      "!$loopy end"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 5
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print(tr_fill)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "---------------------------------------------------------------------------\n",
        "KERNEL: tr_fill\n",
        "---------------------------------------------------------------------------\n",
        "ARGUMENTS:\n",
        "a: ValueArg, type: float64\n",
        "n: ValueArg, type: int32\n",
        "out: GlobalArg, type: float64, shape: (n), dim_tags: (N0:stride:1)\n",
        "---------------------------------------------------------------------------\n",
        "DOMAINS:\n",
        "[n] -> { [i_outer, i_inner] : i_inner >= -128i_outer and i_inner <= -1 + n - 128i_outer and i_inner >= 0 and i_inner <= 127 }\n",
        "---------------------------------------------------------------------------\n",
        "INAME IMPLEMENTATION TAGS:\n",
        "i_inner: l.0\n",
        "i_outer: g.0\n",
        "---------------------------------------------------------------------------\n",
        "INSTRUCTIONS:\n",
        "[i_inner,i_outer]                    out[i_inner + i_outer*128] <- a   # insn0\n",
        "---------------------------------------------------------------------------\n"
       ]
      }
     ],
     "prompt_number": 6
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": []
    }
   ],
   "metadata": {}
  }
 ]
}