{"action":"created","comment":{"url":"https://api.github.com/repos/maxeler/maxpower/pulls/comments/39752801","id":39752801,"diff_hunk":"@@ -0,0 +1,247 @@\n+package maxpower.kernel.mem;\n+\n+import static org.junit.Assert.assertTrue;\n+\n+import java.util.List;\n+\n+import org.junit.Test;\n+\n+import com.maxeler.maxcompiler.v2.kernelcompiler.Kernel;\n+import com.maxeler.maxcompiler.v2.kernelcompiler.KernelParameters;\n+import com.maxeler.maxcompiler.v2.kernelcompiler.types.base.DFEVar;\n+import com.maxeler.maxcompiler.v2.kernelcompiler.types.composite.DFEVector;\n+import com.maxeler.maxcompiler.v2.kernelcompiler.types.composite.DFEVectorType;\n+import com.maxeler.maxcompiler.v2.managers.SimulationParams;\n+import com.maxeler.maxcompiler.v2.managers.standard.SimulationManager;\n+import com.maxeler.maxcompiler.v2.utils.Bits;\n+import com.maxeler.maxcompiler.v2.utils.MathUtils;\n+\n+public class BoxBufferTest {\n+\n+\tprivate static final int m_itemBitWidth = 24;\n+\n+\t@Test public void coprime_5_3()          { testBoxBuffer(1, 3125,  5,  3); }\n+\t@Test public void simple_2_2()           { testBoxBuffer(1, 1024,  2,  2); }\n+\t@Test public void nonPow2simle()         { testBoxBuffer(1, 2508, 12, 12); }\n+\t@Test public void pow2multiple_4_16()    { testBoxBuffer(1, 2500,  4, 16); }\n+\t@Test public void nonPow2multiple_4_20() { testBoxBuffer(1, 2500,  4, 20); }\n+\t@Test public void nonMultiple_12_16()    { testBoxBuffer(1, 2508, 12, 16); }\n+\t@Test public void nonMultiple_16_20()    { testBoxBuffer(1, 2512, 16, 20); }\n+\t@Test public void pow2factor_16_8()      { testBoxBuffer(1, 2512, 16,  8); }\n+\t@Test public void nonFactor_12_8()       { testBoxBuffer(1, 2508, 12,  8); }\n+\n+\t@Test public void simple_2d()            { testBoxBuffer(2, 64, 2, 2, 2); }\n+\t@Test public void coprime_2d()           { testBoxBuffer(2, 90, 5, 3, 2); }\n+\t@Test public void coprime_3d()           { testBoxBuffer(3, 90, 5, 3, 2, 5); }\n+\t@Test public void coprime_4d()           { testBoxBuffer(4, 24, 4, 3, 3, 3, 3); }\n+\n+\n+\tprivate void testBoxBuffer(int numDimensions, int maxItemsPerDim, int numInputItems, int... numOutputItems) {\n+\t\tSimulationManager mgr = new SimulationManager(\"BoxBufferTest_\"+numDimensions+\"D_\"+maxItemsPerDim+\"_\"+numInputItems+\"_\"+numOutputItems[0],  SimulationParams.BITACCURATE_MAX4);\n+\t\tint[] maxItems = new int[numDimensions];\n+\t\tfor (int i = 0; i < numDimensions; i++) {\n+\t\t\tmaxItems[i] = maxItemsPerDim;\n+\t\t}\n+\n+\t\tTestData data = new TestData(maxItems, numInputItems, numOutputItems);\n+\t\tTestKernel dutA = new TestKernel(mgr.makeKernelParameters(), numDimensions, maxItems, numInputItems, numOutputItems);\n+\n+\t\tmgr.setKernel(dutA);\n+\n+\t\tmgr.setInputDataRaw(\"wrData\", data.m_wrData);\n+\n+\t\tmgr.setInputData(\"wrEnable\", data.m_wrEnable);\n+\t\tfor (int i = 0; i < numDimensions; i++) {\n+\t\t\tmgr.setInputData(\"wrIndex\"+i,  data.m_wrIndex[i]);\n+\t\t\tmgr.setInputData(\"rdIndex\"+i,  data.m_rdIndex[i]);\n+\t\t}\n+\n+\t\tmgr.setKernelCycles(data.m_numCycles);\n+\n+\t\tmgr.runTest();\n+\n+\t\tassertTrue(data.testOutput(mgr.getOutputDataRaw(\"rdData\")));\n+\t}\n+\n+\n+\tprivate class TestKernel extends Kernel {\n+\t\tTestKernel(KernelParameters p, int numDimensions, int[] maxItems, int numInputItems, int[] numOutputItems) {\n+\t\t\tsuper(p);\n+\t\t\tint numCycles = product(maxItems);\n+\t\t\tDFEVectorType<DFEVar> inType  = new DFEVectorType<DFEVar>(dfeUInt(m_itemBitWidth), numInputItems);\n+\t\t\tDFEVectorType<DFEVar> outType = new DFEVectorType<DFEVar>(dfeUInt(m_itemBitWidth), product(numOutputItems));\n+\t\t\tDFEVar[] wrIndex = new DFEVar[numDimensions];\n+\t\t\tDFEVar[] rdIndex = new DFEVar[numDimensions];\n+\t\t\tfor (int i = 0; i < numDimensions; i++) {\n+\t\t\t\tint idxBits = MathUtils.bitsToAddress(maxItems[i]);\n+\t\t\t\twrIndex[i] = io.input(\"wrIndex\"+i,  dfeUInt(idxBits));\n+\t\t\t\trdIndex[i] = stream.offset(io.input(\"rdIndex\"+i,  dfeUInt(idxBits)), -numCycles);\n+\t\t\t}\n+\n+\t\t\tDFEVar wrEnable = io.input(\"wrEnable\", dfeUInt(1));\n+\n+\t\t\tDFEVector<DFEVar> wrData = io.input(\"wrData\", inType);\n+\n+\t\t\tDFEVector<DFEVar> output;\n+\t\t\tif (numDimensions == 1) {\n+\t\t\t\tBoxBuffer1D<DFEVar> buffer = new BoxBuffer1D<DFEVar>(this, maxItems[0], numOutputItems[0], inType);\n+\t\t\t\tbuffer.write(wrData, wrIndex[0], wrEnable);\n+\t\t\t\toutput = buffer.read(rdIndex[0]);\n+\t\t\t} else {\n+\t\t\t\tBoxBuffer<DFEVar> buffer = new BoxBuffer<DFEVar>(this, maxItems, numOutputItems, inType);\n+\t\t\t\tbuffer.write(wrData, wrIndex, wrEnable);\n+\t\t\t\toutput = buffer.read(rdIndex);\n+\t\t\t}\n+\t\t\tio.output(\"rdData\", outType) <== stream.offset(output, numCycles);\n+\t\t}\n+\t}\n+\n+\tprivate class TestData {\n+\t\tfinal int[] m_data;\n+\t\tfinal Bits[] m_wrData;\n+\t\tfinal double[] m_wrEnable;\n+\t\tfinal double[][] m_wrIndex;\n+\t\tfinal double[][] m_rdIndex;\n+\t\tfinal int m_numCycles;\n+\t\tfinal int[] m_numOutputItems;\n+\t\tfinal int[] m_maxItems;\n+\n+\n+\t\tpublic TestData(int[] maxItems, int numInputItems, int[] numOutputItems) {\n+\t\t\tDFEVectorType<DFEVar> inType = new DFEVectorType<DFEVar>(Kernel.dfeUInt(m_itemBitWidth), numInputItems);\n+\t\t\tif (maxItems[maxItems.length - 1] % numInputItems != 0) {\n+\t\t\t\tthrow new RuntimeException(\"Maximum number of items in the fast dimension needs to be a multiple of the number of input items.\");\n+\t\t\t}\n+\t\t\tm_numCycles       = product(maxItems) / numInputItems;\n+\t\t\tm_numOutputItems  = new int[numOutputItems.length];\n+\t\t\tm_maxItems        = new int[maxItems.length];\n+\t\t\tint[] lastAddress = new int[maxItems.length];\n+\t\t\tfor (int i = 0; i < maxItems.length; i++) {\n+\t\t\t\tm_numOutputItems[i] = numOutputItems[i];\n+\t\t\t\tm_maxItems[i] = maxItems[i];\n+\t\t\t\tlastAddress[i] = maxItems[i] - numOutputItems[i];\n+\t\t\t}\n+\t\t\tint lastIndex = getIndex(lastAddress);\n+\n+\t\t\tm_data = new int[product(m_maxItems)];\n+\t\t\tfor (int i = 0; i < m_data.length; i++) {\n+\t\t\t\tm_data[i] = i % (1 << m_itemBitWidth);\n+\t\t\t}\n+\n+\t\t\tm_wrData   = new Bits[m_numCycles];\n+\t\t\tm_wrEnable = new double[m_numCycles];\n+\t\t\tm_wrIndex  = new double[m_maxItems.length][m_numCycles];\n+\t\t\tm_rdIndex  = new double[m_maxItems.length][m_numCycles];\n+\n+\t\t\t// Build up input data\n+\t\t\tfor (int i = 0; i < m_numCycles; i++) {\n+\t\t\t\tm_wrEnable[i] = 1;\n+\t\t\t\tint[] input = new int[numInputItems];\n+\t\t\t\tfor (int j = 0; j < numInputItems; j++) {\n+\t\t\t\t\tinput[j] = m_data[numInputItems * i + j];\n+\t\t\t\t}\n+\t\t\t\tm_wrData[i] = inType.encodeConstant(input);\n+\n+\t\t\t\tint readIndex = 0;\n+\t\t\t\t// Test the corners first, then random offsets\n+\t\t\t\tswitch (i) {\n+\t\t\t\t\tcase 0:\n+\t\t\t\t\t\treadIndex = lastIndex;\n+\t\t\t\t\t\tbreak;\n+\t\t\t\t\tcase 1:\n+\t\t\t\t\t\treadIndex = 0;\n+\t\t\t\t\t\tbreak;\n+\t\t\t\t\tdefault:\n+\t\t\t\t\t\treadIndex = ((int) (Math.random() * lastIndex));\n+\t\t\t\t}\n+\t\t\t\tint[] readIndices = getAddress(readIndex);\n+\t\t\t\tfor (int dim = 0; dim < readIndices.length; dim++) {//Shift it back into a valid range if we have gone off the edge\n+\t\t\t\t\treadIndices[dim] = Math.min(readIndices[dim], m_maxItems[dim] - m_numOutputItems[dim]);\n+\t\t\t\t}\n+\t\t\t\tint[] writeIndices = getAddress(numInputItems * (long)i);\n+\t\t\t\tfor (int j = maxItems.length - 1; j >= 0; j--) {\n+\t\t\t\t\tm_wrIndex[j][i] = writeIndices[j];\n+\t\t\t\t\tm_rdIndex[j][i] = readIndices[j];\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\n+\t\tprivate int[] getAddress(long index) {\n+\t\t\tint denom = 1;\n+\t\t\tint[] address = new int[m_maxItems.length];\n+\t\t\tfor (int dim = m_maxItems.length - 1; dim >= 0; dim--) {\n+\t\t\t\taddress[dim] = (int) ((index / denom) % m_maxItems[dim]);\n+\t\t\t\tdenom *= m_maxItems[dim];\n+\t\t\t}\n+\t\t\treturn address;\n+\t\t}\n+\n+\t\tprivate int getIndex(int[] address) {\n+\t\t\tint skip = 1;\n+\t\t\tint index = 0;\n+\t\t\tfor (int dim = m_maxItems.length - 1; dim >= 0; dim--) {\n+\t\t\t\tindex += address[dim] * skip;\n+\t\t\t\tskip *= m_maxItems[dim];\n+\t\t\t}\n+\t\t\treturn index;\n+\t\t}\n+\n+\t\tprivate int[] extractBlock(int[] address) {\n+\t\t\tint[] output = new int[product(m_numOutputItems)];\n+\t\t\tfor (int i = 0; i < output.length; i++) {\n+\t\t\t\tint[] newAddress = new int[address.length];\n+\t\t\t\tint denom = 1;\n+\t\t\t\tfor (int dim = m_numOutputItems.length - 1; dim >= 0; dim--) {\n+\t\t\t\t\tnewAddress[dim] = address[dim] + (i / denom) % m_numOutputItems[dim];\n+\t\t\t\t\tdenom *= m_numOutputItems[dim];\n+\t\t\t\t}\n+\t\t\t\tint index = getIndex(newAddress);\n+\t\t\t\toutput[i] = m_data[index];\n+\t\t\t}\n+\t\t\treturn output;\n+\t\t}\n+\n+\t\tprivate int[] getReadAddress(int cycle) {\n+\t\t\tint[] address = new int[m_maxItems.length];\n+\t\t\tfor (int dim = 0; dim < m_maxItems.length; dim++) {\n+\t\t\t\taddress[dim] = (int)m_rdIndex[dim][cycle];\n+\t\t\t}\n+\t\t\treturn address;\n+\t\t}\n+\n+\t\tprivate String printArray(int[] array) {\n+\t\t\tString output = \" { \";\n+\t\t\tfor (int i = 0; i < array.length - 1; i++) {\n+\t\t\t\toutput += array[i] + \", \";\n+\t\t\t}\n+\t\t\toutput += array[array.length - 1] + \" } \";\n+\t\t\treturn output;\n+\t\t}\n+\n+\t\tpublic boolean testOutput(List<Bits> rdData) {\n+\t\t\tDFEVectorType<DFEVar> outType = new DFEVectorType<DFEVar>(Kernel.dfeUInt(m_itemBitWidth), product(m_numOutputItems));\n+\t\t\tboolean testPassed = true;\n+\t\t\tfor (int i = 0; i < m_numCycles; i++) {\n+\t\t\t\t@SuppressWarnings(\"unchecked\")\n+                List<Double> output = outType.decodeConstant(rdData[i]);","path":"test/maxpower/kernel/mem/BoxBufferTest.java","position":226,"original_position":226,"commit_id":"60d80d4b9831ec84b315401aa970749cf3c11f0c","original_commit_id":"60d80d4b9831ec84b315401aa970749cf3c11f0c","user":{"login":"chr1sj0nes","id":387854,"avatar_url":"https://avatars.githubusercontent.com/u/387854?v=3","gravatar_id":"","url":"https://api.github.com/users/chr1sj0nes","html_url":"https://github.com/chr1sj0nes","followers_url":"https://api.github.com/users/chr1sj0nes/followers","following_url":"https://api.github.com/users/chr1sj0nes/following{/other_user}","gists_url":"https://api.github.com/users/chr1sj0nes/gists{/gist_id}","starred_url":"https://api.github.com/users/chr1sj0nes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chr1sj0nes/subscriptions","organizations_url":"https://api.github.com/users/chr1sj0nes/orgs","repos_url":"https://api.github.com/users/chr1sj0nes/repos","events_url":"https://api.github.com/users/chr1sj0nes/events{/privacy}","received_events_url":"https://api.github.com/users/chr1sj0nes/received_events","type":"User","site_admin":false},"body":"Another indentation failure. Can you please double check all these files for spaces which should be tabs.","created_at":"2015-09-17T14:38:41Z","updated_at":"2015-09-17T14:38:41Z","html_url":"https://github.com/maxeler/maxpower/pull/28#discussion_r39752801","pull_request_url":"https://api.github.com/repos/maxeler/maxpower/pulls/28","_links":{"self":{"href":"https://api.github.com/repos/maxeler/maxpower/pulls/comments/39752801"},"html":{"href":"https://github.com/maxeler/maxpower/pull/28#discussion_r39752801"},"pull_request":{"href":"https://api.github.com/repos/maxeler/maxpower/pulls/28"}}},"pull_request":{"url":"https://api.github.com/repos/maxeler/maxpower/pulls/28","id":45205154,"html_url":"https://github.com/maxeler/maxpower/pull/28","diff_url":"https://github.com/maxeler/maxpower/pull/28.diff","patch_url":"https://github.com/maxeler/maxpower/pull/28.patch","issue_url":"https://api.github.com/repos/maxeler/maxpower/issues/28","number":28,"state":"open","locked":false,"title":"Boxbuffer","user":{"login":"stepeh","id":12087956,"avatar_url":"https://avatars.githubusercontent.com/u/12087956?v=3","gravatar_id":"","url":"https://api.github.com/users/stepeh","html_url":"https://github.com/stepeh","followers_url":"https://api.github.com/users/stepeh/followers","following_url":"https://api.github.com/users/stepeh/following{/other_user}","gists_url":"https://api.github.com/users/stepeh/gists{/gist_id}","starred_url":"https://api.github.com/users/stepeh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stepeh/subscriptions","organizations_url":"https://api.github.com/users/stepeh/orgs","repos_url":"https://api.github.com/users/stepeh/repos","events_url":"https://api.github.com/users/stepeh/events{/privacy}","received_events_url":"https://api.github.com/users/stepeh/received_events","type":"User","site_admin":false},"body":"This is a multi-dimensional version of the WindowsReadRAM that was in MaxJlibs. It is also significantly improved and optimised even for the 1D case.\r\n","created_at":"2015-09-16T18:11:33Z","updated_at":"2015-09-17T14:38:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"840cfd491427b547b6b564f0f9d20cdf6b86a137","assignee":{"login":"chr1sj0nes","id":387854,"avatar_url":"https://avatars.githubusercontent.com/u/387854?v=3","gravatar_id":"","url":"https://api.github.com/users/chr1sj0nes","html_url":"https://github.com/chr1sj0nes","followers_url":"https://api.github.com/users/chr1sj0nes/followers","following_url":"https://api.github.com/users/chr1sj0nes/following{/other_user}","gists_url":"https://api.github.com/users/chr1sj0nes/gists{/gist_id}","starred_url":"https://api.github.com/users/chr1sj0nes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chr1sj0nes/subscriptions","organizations_url":"https://api.github.com/users/chr1sj0nes/orgs","repos_url":"https://api.github.com/users/chr1sj0nes/repos","events_url":"https://api.github.com/users/chr1sj0nes/events{/privacy}","received_events_url":"https://api.github.com/users/chr1sj0nes/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/maxeler/maxpower/pulls/28/commits","review_comments_url":"https://api.github.com/repos/maxeler/maxpower/pulls/28/comments","review_comment_url":"https://api.github.com/repos/maxeler/maxpower/pulls/comments{/number}","comments_url":"https://api.github.com/repos/maxeler/maxpower/issues/28/comments","statuses_url":"https://api.github.com/repos/maxeler/maxpower/statuses/60d80d4b9831ec84b315401aa970749cf3c11f0c","head":{"label":"maxeler:boxbuffer","ref":"boxbuffer","sha":"60d80d4b9831ec84b315401aa970749cf3c11f0c","user":{"login":"maxeler","id":10088478,"avatar_url":"https://avatars.githubusercontent.com/u/10088478?v=3","gravatar_id":"","url":"https://api.github.com/users/maxeler","html_url":"https://github.com/maxeler","followers_url":"https://api.github.com/users/maxeler/followers","following_url":"https://api.github.com/users/maxeler/following{/other_user}","gists_url":"https://api.github.com/users/maxeler/gists{/gist_id}","starred_url":"https://api.github.com/users/maxeler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maxeler/subscriptions","organizations_url":"https://api.github.com/users/maxeler/orgs","repos_url":"https://api.github.com/users/maxeler/repos","events_url":"https://api.github.com/users/maxeler/events{/privacy}","received_events_url":"https://api.github.com/users/maxeler/received_events","type":"Organization","site_admin":false},"repo":{"id":27921920,"name":"maxpower","full_name":"maxeler/maxpower","owner":{"login":"maxeler","id":10088478,"avatar_url":"https://avatars.githubusercontent.com/u/10088478?v=3","gravatar_id":"","url":"https://api.github.com/users/maxeler","html_url":"https://github.com/maxeler","followers_url":"https://api.github.com/users/maxeler/followers","following_url":"https://api.github.com/users/maxeler/following{/other_user}","gists_url":"https://api.github.com/users/maxeler/gists{/gist_id}","starred_url":"https://api.github.com/users/maxeler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maxeler/subscriptions","organizations_url":"https://api.github.com/users/maxeler/orgs","repos_url":"https://api.github.com/users/maxeler/repos","events_url":"https://api.github.com/users/maxeler/events{/privacy}","received_events_url":"https://api.github.com/users/maxeler/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/maxeler/maxpower","description":"Maxeler standard library","fork":false,"url":"https://api.github.com/repos/maxeler/maxpower","forks_url":"https://api.github.com/repos/maxeler/maxpower/forks","keys_url":"https://api.github.com/repos/maxeler/maxpower/keys{/key_id}","collaborators_url":"https://api.github.com/repos/maxeler/maxpower/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/maxeler/maxpower/teams","hooks_url":"https://api.github.com/repos/maxeler/maxpower/hooks","issue_events_url":"https://api.github.com/repos/maxeler/maxpower/issues/events{/number}","events_url":"https://api.github.com/repos/maxeler/maxpower/events","assignees_url":"https://api.github.com/repos/maxeler/maxpower/assignees{/user}","branches_url":"https://api.github.com/repos/maxeler/maxpower/branches{/branch}","tags_url":"https://api.github.com/repos/maxeler/maxpower/tags","blobs_url":"https://api.github.com/repos/maxeler/maxpower/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/maxeler/maxpower/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/maxeler/maxpower/git/refs{/sha}","trees_url":"https://api.github.com/repos/maxeler/maxpower/git/trees{/sha}","statuses_url":"https://api.github.com/repos/maxeler/maxpower/statuses/{sha}","languages_url":"https://api.github.com/repos/maxeler/maxpower/languages","stargazers_url":"https://api.github.com/repos/maxeler/maxpower/stargazers","contributors_url":"https://api.github.com/repos/maxeler/maxpower/contributors","subscribers_url":"https://api.github.com/repos/maxeler/maxpower/subscribers","subscription_url":"https://api.github.com/repos/maxeler/maxpower/subscription","commits_url":"https://api.github.com/repos/maxeler/maxpower/commits{/sha}","git_commits_url":"https://api.github.com/repos/maxeler/maxpower/git/commits{/sha}","comments_url":"https://api.github.com/repos/maxeler/maxpower/comments{/number}","issue_comment_url":"https://api.github.com/repos/maxeler/maxpower/issues/comments{/number}","contents_url":"https://api.github.com/repos/maxeler/maxpower/contents/{+path}","compare_url":"https://api.github.com/repos/maxeler/maxpower/compare/{base}...{head}","merges_url":"https://api.github.com/repos/maxeler/maxpower/merges","archive_url":"https://api.github.com/repos/maxeler/maxpower/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/maxeler/maxpower/downloads","issues_url":"https://api.github.com/repos/maxeler/maxpower/issues{/number}","pulls_url":"https://api.github.com/repos/maxeler/maxpower/pulls{/number}","milestones_url":"https://api.github.com/repos/maxeler/maxpower/milestones{/number}","notifications_url":"https://api.github.com/repos/maxeler/maxpower/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/maxeler/maxpower/labels{/name}","releases_url":"https://api.github.com/repos/maxeler/maxpower/releases{/id}","created_at":"2014-12-12T13:40:35Z","updated_at":"2015-09-16T23:00:32Z","pushed_at":"2015-09-17T14:19:07Z","git_url":"git://github.com/maxeler/maxpower.git","ssh_url":"git@github.com:maxeler/maxpower.git","clone_url":"https://github.com/maxeler/maxpower.git","svn_url":"https://github.com/maxeler/maxpower","homepage":null,"size":1227,"stargazers_count":6,"watchers_count":6,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":4,"mirror_url":null,"open_issues_count":7,"forks":4,"open_issues":7,"watchers":6,"default_branch":"master"}},"base":{"label":"maxeler:master","ref":"master","sha":"d24cdccbdbb64408f043fb71a4fc13ffa929ad5e","user":{"login":"maxeler","id":10088478,"avatar_url":"https://avatars.githubusercontent.com/u/10088478?v=3","gravatar_id":"","url":"https://api.github.com/users/maxeler","html_url":"https://github.com/maxeler","followers_url":"https://api.github.com/users/maxeler/followers","following_url":"https://api.github.com/users/maxeler/following{/other_user}","gists_url":"https://api.github.com/users/maxeler/gists{/gist_id}","starred_url":"https://api.github.com/users/maxeler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maxeler/subscriptions","organizations_url":"https://api.github.com/users/maxeler/orgs","repos_url":"https://api.github.com/users/maxeler/repos","events_url":"https://api.github.com/users/maxeler/events{/privacy}","received_events_url":"https://api.github.com/users/maxeler/received_events","type":"Organization","site_admin":false},"repo":{"id":27921920,"name":"maxpower","full_name":"maxeler/maxpower","owner":{"login":"maxeler","id":10088478,"avatar_url":"https://avatars.githubusercontent.com/u/10088478?v=3","gravatar_id":"","url":"https://api.github.com/users/maxeler","html_url":"https://github.com/maxeler","followers_url":"https://api.github.com/users/maxeler/followers","following_url":"https://api.github.com/users/maxeler/following{/other_user}","gists_url":"https://api.github.com/users/maxeler/gists{/gist_id}","starred_url":"https://api.github.com/users/maxeler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maxeler/subscriptions","organizations_url":"https://api.github.com/users/maxeler/orgs","repos_url":"https://api.github.com/users/maxeler/repos","events_url":"https://api.github.com/users/maxeler/events{/privacy}","received_events_url":"https://api.github.com/users/maxeler/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/maxeler/maxpower","description":"Maxeler standard library","fork":false,"url":"https://api.github.com/repos/maxeler/maxpower","forks_url":"https://api.github.com/repos/maxeler/maxpower/forks","keys_url":"https://api.github.com/repos/maxeler/maxpower/keys{/key_id}","collaborators_url":"https://api.github.com/repos/maxeler/maxpower/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/maxeler/maxpower/teams","hooks_url":"https://api.github.com/repos/maxeler/maxpower/hooks","issue_events_url":"https://api.github.com/repos/maxeler/maxpower/issues/events{/number}","events_url":"https://api.github.com/repos/maxeler/maxpower/events","assignees_url":"https://api.github.com/repos/maxeler/maxpower/assignees{/user}","branches_url":"https://api.github.com/repos/maxeler/maxpower/branches{/branch}","tags_url":"https://api.github.com/repos/maxeler/maxpower/tags","blobs_url":"https://api.github.com/repos/maxeler/maxpower/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/maxeler/maxpower/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/maxeler/maxpower/git/refs{/sha}","trees_url":"https://api.github.com/repos/maxeler/maxpower/git/trees{/sha}","statuses_url":"https://api.github.com/repos/maxeler/maxpower/statuses/{sha}","languages_url":"https://api.github.com/repos/maxeler/maxpower/languages","stargazers_url":"https://api.github.com/repos/maxeler/maxpower/stargazers","contributors_url":"https://api.github.com/repos/maxeler/maxpower/contributors","subscribers_url":"https://api.github.com/repos/maxeler/maxpower/subscribers","subscription_url":"https://api.github.com/repos/maxeler/maxpower/subscription","commits_url":"https://api.github.com/repos/maxeler/maxpower/commits{/sha}","git_commits_url":"https://api.github.com/repos/maxeler/maxpower/git/commits{/sha}","comments_url":"https://api.github.com/repos/maxeler/maxpower/comments{/number}","issue_comment_url":"https://api.github.com/repos/maxeler/maxpower/issues/comments{/number}","contents_url":"https://api.github.com/repos/maxeler/maxpower/contents/{+path}","compare_url":"https://api.github.com/repos/maxeler/maxpower/compare/{base}...{head}","merges_url":"https://api.github.com/repos/maxeler/maxpower/merges","archive_url":"https://api.github.com/repos/maxeler/maxpower/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/maxeler/maxpower/downloads","issues_url":"https://api.github.com/repos/maxeler/maxpower/issues{/number}","pulls_url":"https://api.github.com/repos/maxeler/maxpower/pulls{/number}","milestones_url":"https://api.github.com/repos/maxeler/maxpower/milestones{/number}","notifications_url":"https://api.github.com/repos/maxeler/maxpower/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/maxeler/maxpower/labels{/name}","releases_url":"https://api.github.com/repos/maxeler/maxpower/releases{/id}","created_at":"2014-12-12T13:40:35Z","updated_at":"2015-09-16T23:00:32Z","pushed_at":"2015-09-17T14:19:07Z","git_url":"git://github.com/maxeler/maxpower.git","ssh_url":"git@github.com:maxeler/maxpower.git","clone_url":"https://github.com/maxeler/maxpower.git","svn_url":"https://github.com/maxeler/maxpower","homepage":null,"size":1227,"stargazers_count":6,"watchers_count":6,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":4,"mirror_url":null,"open_issues_count":7,"forks":4,"open_issues":7,"watchers":6,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/maxeler/maxpower/pulls/28"},"html":{"href":"https://github.com/maxeler/maxpower/pull/28"},"issue":{"href":"https://api.github.com/repos/maxeler/maxpower/issues/28"},"comments":{"href":"https://api.github.com/repos/maxeler/maxpower/issues/28/comments"},"review_comments":{"href":"https://api.github.com/repos/maxeler/maxpower/pulls/28/comments"},"review_comment":{"href":"https://api.github.com/repos/maxeler/maxpower/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/maxeler/maxpower/pulls/28/commits"},"statuses":{"href":"https://api.github.com/repos/maxeler/maxpower/statuses/60d80d4b9831ec84b315401aa970749cf3c11f0c"}}}}