Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RTL talk #16 dalance

dalance
November 10, 2019

RTL talk #16 dalance

dalance

November 10, 2019
Tweet

More Decks by dalance

Other Decks in Programming

Transcript

  1. プログラミング言語Rust(1/4) • システムプログラミング言語 ◦ C/C++と同じ領域 ▪ Goと比較されることもあるが、それほど被ってない ◦ GCやVMなし。ベアメタル環境でも使える ▪

    OS実装やUEFI実装あり ◦ 組み込みプロセッサ対応 ▪ ARM・RISC-Vの公式サポート ▪ (当然非公式ですが) PEZY-SCもいける “rust-logo-512x512.png” by Mozilla is licensed under CC BY 4.0
  2. プログラミング言語Rust(2/4) • モダンな言語機能 ◦ 基本は命令型プログラミング ◦ 関数型言語由来の機能も取り込んでいる ▪ 型クラス、型推論、式志向、イミュータブル ◦

    独特のメモリ管理 ▪ メモリ解放タイミングをコンパイル時に決定する • GCがなくてもメモリは自動解放される ▪ 決定できないコードを書くとコンパイラに怒られる • いわゆる「ボローチェッカとの戦い」 “rust-logo-512x512.png” by Mozilla is licensed under CC BY 4.0
  3. プログラミング言語Rust(3/4) • 整備された公式ツール群 ◦ コンパイラバージョン管理 ▪ rustup ◦ ビルドツール ▪

    cargo ◦ ライブラリリポジトリ ▪ crates.io ◦ ドキュメントホスティング ▪ docs.rs ◦ リンタ・フォーマッタ・ Language Server ▪ cargo-clippy/rustfmt/rls ◦ テストフレームワーク “rust-logo-512x512.png” by Mozilla is licensed under CC BY 4.0
  4. 作ったツール(1/2) • amber ◦ grep/sedの代替 ◦ 巨大なネットリストを高速に検索するために作った • procs ◦

    psの代替 ◦ ライセンスを掴みっぱなしで暴走する EDAツールをスムーズに殺すため • ptags ◦ ctagsラッパー ◦ ネットリストなどを無視して並列にタグ生成する
  5. 作ったツール(2/2) • pipecolor ◦ EDAツールのコンソール出力を色付けする • git-skel ◦ 複数プロジェクトでスクリプト類の同期を取る •

    flexlint ◦ 正規表現ベースのリントチェッカ ◦ 今回はこれをSVパーサベースのものに置き換えるのが目標
  6. 用意するもの • SystemVerilog言語仕様 ◦ IEEE Std 1800-2017 ◦ ユーザ登録すれば無料で手に入る •

    パーサコンビネータライブラリ/パーサジェネレータ ◦ 量が多いので手書きは厳しい ◦ 今回はRustの型システムの恩恵を得たかったのでパーサコンビネータ • 時間 ◦ 量が多いので ◦ 会社の業務に絡めて時間を捻出 • 根気 ◦ 量が
  7. パーサを作っていく • BNFを見ながらパーサコンビネータに落としていく ◦ 型定義を厳密にしたかったので構文木の型定義も function_declaration ::= function [ lifetime

    ] function_body_declaration #[tracable_parser] #[packrat_parser] pub(crate) fn function_declaration(s: Span) -> IResult<Span, FunctionDeclaration> { let (s, a) = keyword("function")(s)?; let (s, b) = opt(lifetime)(s)?; let (s, c) = function_body_declaration(s)?; Ok((s, FunctionDeclaration { nodes: (a, b, c) })) } #[derive(Clone, Debug, PartialEq, Node)] pub struct FunctionDeclaration { pub nodes: (Keyword, Option<Lifetime>, FunctionBodyDeclaration), }
  8. 作業量 • 実装期間 ◦ 約3か月 • ソースコード ◦ 全35000行 ◦

    何度か全書き直しに近いことをしたので差分はかなり多い
  9. 言語仕様のミス?発見 • パースできないサンプルソース多数 ◦ Typo、括弧の対応漏れ ▪ 一目で分かるものから、なんだかよく分からないものまで ◦ Unicode記号 ▪

    “-”(ハイフン)と思いきや “–”(ENダッシュ: U+2013) ◦ 通りそうなソースコードが BNFで受理できそうにない ▪ パラメータオーバーライド付き classのstaticメソッド ▪ [x: $]みたいなレンジアクセス ▪ 階層付きのrandomize引数 • Accelleraに報告を試みたが音信不通 ◦ お金払ってないとダメなのか
  10. ライブラリを使ってツールを作る(2/2) • フォーマッタ ◦ 次の目標 ◦ リントよりはハードル高そう。マクロ絡みの扱いなど • Language Server

    ◦ VSCodeのSV拡張がいまいちらしい(伝聞) ◦ Language Server実装にしてどのエディタでも使えるようにしたい