{"action":"created","comment":{"url":"https://api.github.com/repos/ucb-bar/chisel3/pulls/comments/63260090","id":63260090,"diff_hunk":"@@ -0,0 +1,180 @@\n+// See LICENSE for license details.\n+\n+// This file transform macro definitions to explicitly add implicit source info to Chisel method\n+// calls.\n+\n+package Chisel.internal.sourceinfo\n+\n+import scala.language.experimental.macros\n+import scala.reflect.macros.blackbox.Context\n+\n+\n+/** Transforms a function call so that it can both provide implicit-style source information and\n+  * have a chained apply call. Without macros, only one is possible, since having a implicit\n+  * argument in the definition will cause the compiler to interpret a chained apply as an\n+  * explicit implicit argument and give type errors.\n+  *\n+  * Instead of an implicit argument, the public-facing function no longer takes a SourceInfo at all.\n+  * The macro transforms the public-facing function into a call to an internal function that takes\n+  * an explicit SourceInfo by inserting an implicitly[SourceInfo] as the explicit argument.\n+  */\n+trait SourceInfoTransformMacro {\n+  val c: Context\n+  import c.universe._\n+  def thisObj = c.prefix.tree\n+  def implicitSourceInfo = q\"implicitly[_root_.Chisel.internal.sourceinfo.SourceInfo]\"\n+}\n+\n+class WireTransform(val c: Context) extends SourceInfoTransformMacro {\n+  import c.universe._\n+  def apply[T: c.WeakTypeTag](t: c.Tree): c.Tree = {\n+    val tpe = weakTypeOf[T]\n+    q\"$thisObj.do_apply($t, null.asInstanceOf[$tpe])($implicitSourceInfo)\"\n+  }\n+}\n+\n+class UIntTransform(val c: Context) extends SourceInfoTransformMacro {\n+  import c.universe._\n+  def bitset(off: c.Tree, dat: c.Tree): c.Tree = {\n+    q\"$thisObj.do_bitSet($off, $dat)($implicitSourceInfo)\"\n+  }\n+}\n+\n+// Module instantiation transform\n+class InstTransform(val c: Context) extends SourceInfoTransformMacro {\n+  import c.universe._\n+  def apply[T: c.WeakTypeTag](bc: c.Tree): c.Tree = {\n+    q\"$thisObj.do_apply($bc)($implicitSourceInfo)\"\n+  }\n+}\n+\n+class MemTransform(val c: Context) extends SourceInfoTransformMacro {\n+  import c.universe._\n+  def apply[T: c.WeakTypeTag](size: c.Tree, t: c.Tree): c.Tree = {\n+    q\"$thisObj.do_apply($size, $t)($implicitSourceInfo)\"\n+  }\n+}\n+\n+class RegTransform(val c: Context) extends SourceInfoTransformMacro {\n+  import c.universe._\n+  def apply[T: c.WeakTypeTag](t: c.Tree): c.Tree = {\n+    val tpe = weakTypeOf[T]\n+    q\"$thisObj.do_apply($t, null.asInstanceOf[$tpe], null.asInstanceOf[$tpe])($implicitSourceInfo)\"\n+  }\n+}\n+\n+class WhenTransform(val c: Context) extends SourceInfoTransformMacro {\n+  import c.universe._\n+  def apply(cond: c.Tree)(block: c.Tree): c.Tree = {\n+    q\"$thisObj.do_apply($cond, $block)($implicitSourceInfo)\"\n+  }\n+\n+  def elsewhen(elseCond: c.Tree)(block: c.Tree): c.Tree = {\n+    q\"$thisObj.do_elsewhen($elseCond, $block)($implicitSourceInfo)\"\n+  }\n+\n+  def otherwise(block: c.Tree): c.Tree = {\n+    q\"$thisObj.do_otherwise($block)($implicitSourceInfo)\"\n+  }\n+}\n+\n+class StopTransform(val c: Context) extends SourceInfoTransformMacro {\n+  import c.universe._\n+  def stop(): c.Tree = {\n+    q\"$thisObj.do_stop($implicitSourceInfo)\"\n+  }\n+}\n+\n+class PrintTransform(val c: Context) extends SourceInfoTransformMacro {\n+  import c.universe._\n+  def apply(fmt: c.Tree, data: c.Tree*): c.Tree = {\n+    q\"$thisObj.do_apply($fmt, ..$data)($implicitSourceInfo)\"\n+  }\n+}\n+\n+class AssertTransform(val c: Context) extends SourceInfoTransformMacro {\n+  import c.universe._\n+  def apply_msg(cond: c.Tree, message: c.Tree): c.Tree = {\n+    q\"$thisObj.do_apply($cond, $message)($implicitSourceInfo)\"\n+  }\n+  def apply(cond: c.Tree): c.Tree = {\n+    q\"$thisObj.do_apply($cond)($implicitSourceInfo)\"\n+  }\n+}\n+\n+class MuxTransform(val c: Context) extends SourceInfoTransformMacro {\n+  import c.universe._\n+  def apply[T: c.WeakTypeTag](cond: c.Tree, con: c.Tree, alt: c.Tree): c.Tree = {\n+    val tpe = weakTypeOf[T]\n+    q\"$thisObj.do_apply[$tpe]($cond, $con, $alt)($implicitSourceInfo)\"\n+  }\n+}\n+\n+class VecTransform(val c: Context) extends SourceInfoTransformMacro {\n+  import c.universe._\n+  def apply_elts(elts: c.Tree): c.Tree = {\n+    q\"$thisObj.do_apply($elts)($implicitSourceInfo)\"\n+  }\n+  def apply_elt0(elt0: c.Tree, elts: c.Tree*): c.Tree = {\n+    q\"$thisObj.do_apply($elt0, ..$elts)($implicitSourceInfo)\"\n+  }\n+  def tabulate(n: c.Tree)(gen: c.Tree): c.Tree = {\n+    q\"$thisObj.do_tabulate($n)($gen)($implicitSourceInfo)\"\n+  }\n+  def fill(n: c.Tree)(gen: c.Tree): c.Tree = {\n+    q\"$thisObj.do_fill($n)($gen)($implicitSourceInfo)\"\n+  }\n+  def contains(x: c.Tree)(ev: c.Tree): c.Tree = {\n+    q\"$thisObj.do_contains($x)($implicitSourceInfo, $ev)\"\n+  }\n+}\n+\n+/** \"Automatic\" source information transform / insertion macros, which generate the function name\n+  * based on the macro invocation (instead of explicitly writing out every transform).\n+  */\n+class SourceInfoTransform(val c: Context) extends SourceInfoTransformMacro {\n+  import c.universe._\n+  /** Returns the TermName of the transformed function, which is the applied function name with do_\n+    * prepended.\n+    */\n+  def doFuncTerm = {\n+    val funcName = c.macroApplication match {\n+      case Apply(TypeApply(Select(_, TermName(funcName)), _), _) => funcName\n+      case Apply(Select(_, TermName(funcName)), _) => funcName\n+      case Select(_, TermName(funcName)) => funcName\n+\n+    }\n+    TermName(\"do_\" + funcName)\n+  }\n+\n+  /** Transforms a call of the form obj.fn(that) into obj.do_fn(sourceInfo, that). Single argument\n+    * must be named that.\n+    */\n+  def noArg(): c.Tree = {\n+    q\"$thisObj.$doFuncTerm($implicitSourceInfo)\"\n+  }\n+\n+  def thatArg(that: c.Tree): c.Tree = {\n+    q\"$thisObj.$doFuncTerm($that)($implicitSourceInfo)\"\n+  }\n+","path":"coreMacros/src/main/scala/Chisel/internal/sourceinfo/SourceInfoTransform.scala","position":132,"original_position":160,"commit_id":"78b3525d5fca94c823dc5ab7da26b2e94593ea38","original_commit_id":"1c2fd442b048f7b797a639ae63614579a8933020","user":{"login":"sdtwigg","id":1015800,"avatar_url":"https://avatars.githubusercontent.com/u/1015800?v=3","gravatar_id":"","url":"https://api.github.com/users/sdtwigg","html_url":"https://github.com/sdtwigg","followers_url":"https://api.github.com/users/sdtwigg/followers","following_url":"https://api.github.com/users/sdtwigg/following{/other_user}","gists_url":"https://api.github.com/users/sdtwigg/gists{/gist_id}","starred_url":"https://api.github.com/users/sdtwigg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sdtwigg/subscriptions","organizations_url":"https://api.github.com/users/sdtwigg/orgs","repos_url":"https://api.github.com/users/sdtwigg/repos","events_url":"https://api.github.com/users/sdtwigg/events{/privacy}","received_events_url":"https://api.github.com/users/sdtwigg/received_events","type":"User","site_admin":false},"body":"I specifically placed the comment after that function because I was okay with 'that'.\r\n\r\nPS: pun intended","created_at":"2016-05-13T22:31:52Z","updated_at":"2016-05-13T22:31:52Z","html_url":"https://github.com/ucb-bar/chisel3/pull/186#discussion_r63260090","pull_request_url":"https://api.github.com/repos/ucb-bar/chisel3/pulls/186","_links":{"self":{"href":"https://api.github.com/repos/ucb-bar/chisel3/pulls/comments/63260090"},"html":{"href":"https://github.com/ucb-bar/chisel3/pull/186#discussion_r63260090"},"pull_request":{"href":"https://api.github.com/repos/ucb-bar/chisel3/pulls/186"}}},"pull_request":{"url":"https://api.github.com/repos/ucb-bar/chisel3/pulls/186","id":69761452,"html_url":"https://github.com/ucb-bar/chisel3/pull/186","diff_url":"https://github.com/ucb-bar/chisel3/pull/186.diff","patch_url":"https://github.com/ucb-bar/chisel3/pull/186.patch","issue_url":"https://api.github.com/repos/ucb-bar/chisel3/issues/186","number":186,"state":"open","locked":false,"title":"Source locators","user":{"login":"ducky64","id":1069863,"avatar_url":"https://avatars.githubusercontent.com/u/1069863?v=3","gravatar_id":"","url":"https://api.github.com/users/ducky64","html_url":"https://github.com/ducky64","followers_url":"https://api.github.com/users/ducky64/followers","following_url":"https://api.github.com/users/ducky64/following{/other_user}","gists_url":"https://api.github.com/users/ducky64/gists{/gist_id}","starred_url":"https://api.github.com/users/ducky64/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ducky64/subscriptions","organizations_url":"https://api.github.com/users/ducky64/orgs","repos_url":"https://api.github.com/users/ducky64/repos","events_url":"https://api.github.com/users/ducky64/events{/privacy}","received_events_url":"https://api.github.com/users/ducky64/received_events","type":"User","site_admin":false},"body":"This basically adds the SourceInfo trait and several concrete classes for when source information isn't available and a concrete class for source information from a Scala source line.\r\n\r\nSource information is also added to the FIRRTL IR nodes and emitter as an explicit parameter. Source information is propagated through the Chisel frontend and internals as an implicit parameter. For methods that don't return Unit (aka nothing), a macro transform explicitly adds the SourceInfo parameter as implicitly[SourceInfo] so apply() calls can be chained after. The transformed versions of methods are of the same name, except with `do_` prepended. One of the macros (`SourceInfoTransform`) automatically detects the function name, which eliminates a lot of boilerplate.\r\n\r\nThe package split is up for debate. There is two packages:\r\ncoreMacros defines the transforms (that add explicit implicits: `implicitly[SourceInfo]`) and nothing else. This allows the macros to be used and invoked at the next level, which prevents a lot of ugly `do_*` calls everywhere. Turns out you just need the macro transform definitions, not the functions that are defined as macros, in a different compilation unit.\r\nchiselFrontend defines the core data types. ~~There's no real reason this needs to be separate from the rest of Chisel (other than the assert macros), but I think there's a certain elegance for splitting core data types from helpers (Driver and friends) and utils.~~ chiselFrontend is split out from the rest of utils as a layer of safety, since the `SourceInfo.materialize` macro is defined in chiselFrontend, this prevents the system from generating source locators in Chisel core, which is almost certainly a bug.\r\n\r\nMems a work in progress, and is dependent on #189. Will be future work, probably near future work.\r\n\r\nDefining how library writers would have source locators for entry points into their libraries is future work.\r\n\r\n~~Only tested with Chisel unit tests. Someone should test with a more complex design, like rocket chip. **Requires a FIRRTL compiler change to support the source info annotations. This will not yet work.** However, you can test correctness without source locators passed through to FIRRTL by eliminating the part in Emitter.scala where the locators are actually generated.~~\r\n\r\nucb-bar/firrtl#166 is in, so this should work now!\r\n\r\nImplementation for #147 \r\nPartially based on implementation sketch in #158","created_at":"2016-05-12T00:01:15Z","updated_at":"2016-05-13T22:31:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"50d6e3acb68bfaa41303909b5c1e554fbc1eba7b","assignee":{"login":"sdtwigg","id":1015800,"avatar_url":"https://avatars.githubusercontent.com/u/1015800?v=3","gravatar_id":"","url":"https://api.github.com/users/sdtwigg","html_url":"https://github.com/sdtwigg","followers_url":"https://api.github.com/users/sdtwigg/followers","following_url":"https://api.github.com/users/sdtwigg/following{/other_user}","gists_url":"https://api.github.com/users/sdtwigg/gists{/gist_id}","starred_url":"https://api.github.com/users/sdtwigg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sdtwigg/subscriptions","organizations_url":"https://api.github.com/users/sdtwigg/orgs","repos_url":"https://api.github.com/users/sdtwigg/repos","events_url":"https://api.github.com/users/sdtwigg/events{/privacy}","received_events_url":"https://api.github.com/users/sdtwigg/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/ucb-bar/chisel3/pulls/186/commits","review_comments_url":"https://api.github.com/repos/ucb-bar/chisel3/pulls/186/comments","review_comment_url":"https://api.github.com/repos/ucb-bar/chisel3/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ucb-bar/chisel3/issues/186/comments","statuses_url":"https://api.github.com/repos/ucb-bar/chisel3/statuses/78b3525d5fca94c823dc5ab7da26b2e94593ea38","head":{"label":"ucb-bar:sloc_impl","ref":"sloc_impl","sha":"78b3525d5fca94c823dc5ab7da26b2e94593ea38","user":{"login":"ucb-bar","id":998197,"avatar_url":"https://avatars.githubusercontent.com/u/998197?v=3","gravatar_id":"","url":"https://api.github.com/users/ucb-bar","html_url":"https://github.com/ucb-bar","followers_url":"https://api.github.com/users/ucb-bar/followers","following_url":"https://api.github.com/users/ucb-bar/following{/other_user}","gists_url":"https://api.github.com/users/ucb-bar/gists{/gist_id}","starred_url":"https://api.github.com/users/ucb-bar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ucb-bar/subscriptions","organizations_url":"https://api.github.com/users/ucb-bar/orgs","repos_url":"https://api.github.com/users/ucb-bar/repos","events_url":"https://api.github.com/users/ucb-bar/events{/privacy}","received_events_url":"https://api.github.com/users/ucb-bar/received_events","type":"Organization","site_admin":false},"repo":{"id":34695562,"name":"chisel3","full_name":"ucb-bar/chisel3","owner":{"login":"ucb-bar","id":998197,"avatar_url":"https://avatars.githubusercontent.com/u/998197?v=3","gravatar_id":"","url":"https://api.github.com/users/ucb-bar","html_url":"https://github.com/ucb-bar","followers_url":"https://api.github.com/users/ucb-bar/followers","following_url":"https://api.github.com/users/ucb-bar/following{/other_user}","gists_url":"https://api.github.com/users/ucb-bar/gists{/gist_id}","starred_url":"https://api.github.com/users/ucb-bar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ucb-bar/subscriptions","organizations_url":"https://api.github.com/users/ucb-bar/orgs","repos_url":"https://api.github.com/users/ucb-bar/repos","events_url":"https://api.github.com/users/ucb-bar/events{/privacy}","received_events_url":"https://api.github.com/users/ucb-bar/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ucb-bar/chisel3","description":"new firrtl based chisel","fork":false,"url":"https://api.github.com/repos/ucb-bar/chisel3","forks_url":"https://api.github.com/repos/ucb-bar/chisel3/forks","keys_url":"https://api.github.com/repos/ucb-bar/chisel3/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ucb-bar/chisel3/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ucb-bar/chisel3/teams","hooks_url":"https://api.github.com/repos/ucb-bar/chisel3/hooks","issue_events_url":"https://api.github.com/repos/ucb-bar/chisel3/issues/events{/number}","events_url":"https://api.github.com/repos/ucb-bar/chisel3/events","assignees_url":"https://api.github.com/repos/ucb-bar/chisel3/assignees{/user}","branches_url":"https://api.github.com/repos/ucb-bar/chisel3/branches{/branch}","tags_url":"https://api.github.com/repos/ucb-bar/chisel3/tags","blobs_url":"https://api.github.com/repos/ucb-bar/chisel3/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ucb-bar/chisel3/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ucb-bar/chisel3/git/refs{/sha}","trees_url":"https://api.github.com/repos/ucb-bar/chisel3/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ucb-bar/chisel3/statuses/{sha}","languages_url":"https://api.github.com/repos/ucb-bar/chisel3/languages","stargazers_url":"https://api.github.com/repos/ucb-bar/chisel3/stargazers","contributors_url":"https://api.github.com/repos/ucb-bar/chisel3/contributors","subscribers_url":"https://api.github.com/repos/ucb-bar/chisel3/subscribers","subscription_url":"https://api.github.com/repos/ucb-bar/chisel3/subscription","commits_url":"https://api.github.com/repos/ucb-bar/chisel3/commits{/sha}","git_commits_url":"https://api.github.com/repos/ucb-bar/chisel3/git/commits{/sha}","comments_url":"https://api.github.com/repos/ucb-bar/chisel3/comments{/number}","issue_comment_url":"https://api.github.com/repos/ucb-bar/chisel3/issues/comments{/number}","contents_url":"https://api.github.com/repos/ucb-bar/chisel3/contents/{+path}","compare_url":"https://api.github.com/repos/ucb-bar/chisel3/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ucb-bar/chisel3/merges","archive_url":"https://api.github.com/repos/ucb-bar/chisel3/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ucb-bar/chisel3/downloads","issues_url":"https://api.github.com/repos/ucb-bar/chisel3/issues{/number}","pulls_url":"https://api.github.com/repos/ucb-bar/chisel3/pulls{/number}","milestones_url":"https://api.github.com/repos/ucb-bar/chisel3/milestones{/number}","notifications_url":"https://api.github.com/repos/ucb-bar/chisel3/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ucb-bar/chisel3/labels{/name}","releases_url":"https://api.github.com/repos/ucb-bar/chisel3/releases{/id}","deployments_url":"https://api.github.com/repos/ucb-bar/chisel3/deployments","created_at":"2015-04-27T22:55:56Z","updated_at":"2016-04-20T08:37:54Z","pushed_at":"2016-05-13T21:01:06Z","git_url":"git://github.com/ucb-bar/chisel3.git","ssh_url":"git@github.com:ucb-bar/chisel3.git","clone_url":"https://github.com/ucb-bar/chisel3.git","svn_url":"https://github.com/ucb-bar/chisel3","homepage":null,"size":1225,"stargazers_count":7,"watchers_count":7,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":29,"forks":5,"open_issues":29,"watchers":7,"default_branch":"master"}},"base":{"label":"ucb-bar:master","ref":"master","sha":"345c85942a8a34eb3da0b0dee71921ce39bba822","user":{"login":"ucb-bar","id":998197,"avatar_url":"https://avatars.githubusercontent.com/u/998197?v=3","gravatar_id":"","url":"https://api.github.com/users/ucb-bar","html_url":"https://github.com/ucb-bar","followers_url":"https://api.github.com/users/ucb-bar/followers","following_url":"https://api.github.com/users/ucb-bar/following{/other_user}","gists_url":"https://api.github.com/users/ucb-bar/gists{/gist_id}","starred_url":"https://api.github.com/users/ucb-bar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ucb-bar/subscriptions","organizations_url":"https://api.github.com/users/ucb-bar/orgs","repos_url":"https://api.github.com/users/ucb-bar/repos","events_url":"https://api.github.com/users/ucb-bar/events{/privacy}","received_events_url":"https://api.github.com/users/ucb-bar/received_events","type":"Organization","site_admin":false},"repo":{"id":34695562,"name":"chisel3","full_name":"ucb-bar/chisel3","owner":{"login":"ucb-bar","id":998197,"avatar_url":"https://avatars.githubusercontent.com/u/998197?v=3","gravatar_id":"","url":"https://api.github.com/users/ucb-bar","html_url":"https://github.com/ucb-bar","followers_url":"https://api.github.com/users/ucb-bar/followers","following_url":"https://api.github.com/users/ucb-bar/following{/other_user}","gists_url":"https://api.github.com/users/ucb-bar/gists{/gist_id}","starred_url":"https://api.github.com/users/ucb-bar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ucb-bar/subscriptions","organizations_url":"https://api.github.com/users/ucb-bar/orgs","repos_url":"https://api.github.com/users/ucb-bar/repos","events_url":"https://api.github.com/users/ucb-bar/events{/privacy}","received_events_url":"https://api.github.com/users/ucb-bar/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ucb-bar/chisel3","description":"new firrtl based chisel","fork":false,"url":"https://api.github.com/repos/ucb-bar/chisel3","forks_url":"https://api.github.com/repos/ucb-bar/chisel3/forks","keys_url":"https://api.github.com/repos/ucb-bar/chisel3/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ucb-bar/chisel3/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ucb-bar/chisel3/teams","hooks_url":"https://api.github.com/repos/ucb-bar/chisel3/hooks","issue_events_url":"https://api.github.com/repos/ucb-bar/chisel3/issues/events{/number}","events_url":"https://api.github.com/repos/ucb-bar/chisel3/events","assignees_url":"https://api.github.com/repos/ucb-bar/chisel3/assignees{/user}","branches_url":"https://api.github.com/repos/ucb-bar/chisel3/branches{/branch}","tags_url":"https://api.github.com/repos/ucb-bar/chisel3/tags","blobs_url":"https://api.github.com/repos/ucb-bar/chisel3/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ucb-bar/chisel3/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ucb-bar/chisel3/git/refs{/sha}","trees_url":"https://api.github.com/repos/ucb-bar/chisel3/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ucb-bar/chisel3/statuses/{sha}","languages_url":"https://api.github.com/repos/ucb-bar/chisel3/languages","stargazers_url":"https://api.github.com/repos/ucb-bar/chisel3/stargazers","contributors_url":"https://api.github.com/repos/ucb-bar/chisel3/contributors","subscribers_url":"https://api.github.com/repos/ucb-bar/chisel3/subscribers","subscription_url":"https://api.github.com/repos/ucb-bar/chisel3/subscription","commits_url":"https://api.github.com/repos/ucb-bar/chisel3/commits{/sha}","git_commits_url":"https://api.github.com/repos/ucb-bar/chisel3/git/commits{/sha}","comments_url":"https://api.github.com/repos/ucb-bar/chisel3/comments{/number}","issue_comment_url":"https://api.github.com/repos/ucb-bar/chisel3/issues/comments{/number}","contents_url":"https://api.github.com/repos/ucb-bar/chisel3/contents/{+path}","compare_url":"https://api.github.com/repos/ucb-bar/chisel3/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ucb-bar/chisel3/merges","archive_url":"https://api.github.com/repos/ucb-bar/chisel3/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ucb-bar/chisel3/downloads","issues_url":"https://api.github.com/repos/ucb-bar/chisel3/issues{/number}","pulls_url":"https://api.github.com/repos/ucb-bar/chisel3/pulls{/number}","milestones_url":"https://api.github.com/repos/ucb-bar/chisel3/milestones{/number}","notifications_url":"https://api.github.com/repos/ucb-bar/chisel3/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ucb-bar/chisel3/labels{/name}","releases_url":"https://api.github.com/repos/ucb-bar/chisel3/releases{/id}","deployments_url":"https://api.github.com/repos/ucb-bar/chisel3/deployments","created_at":"2015-04-27T22:55:56Z","updated_at":"2016-04-20T08:37:54Z","pushed_at":"2016-05-13T21:01:06Z","git_url":"git://github.com/ucb-bar/chisel3.git","ssh_url":"git@github.com:ucb-bar/chisel3.git","clone_url":"https://github.com/ucb-bar/chisel3.git","svn_url":"https://github.com/ucb-bar/chisel3","homepage":null,"size":1225,"stargazers_count":7,"watchers_count":7,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":29,"forks":5,"open_issues":29,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ucb-bar/chisel3/pulls/186"},"html":{"href":"https://github.com/ucb-bar/chisel3/pull/186"},"issue":{"href":"https://api.github.com/repos/ucb-bar/chisel3/issues/186"},"comments":{"href":"https://api.github.com/repos/ucb-bar/chisel3/issues/186/comments"},"review_comments":{"href":"https://api.github.com/repos/ucb-bar/chisel3/pulls/186/comments"},"review_comment":{"href":"https://api.github.com/repos/ucb-bar/chisel3/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ucb-bar/chisel3/pulls/186/commits"},"statuses":{"href":"https://api.github.com/repos/ucb-bar/chisel3/statuses/78b3525d5fca94c823dc5ab7da26b2e94593ea38"}}}}