はぐれエンジニアつれづれ

デジタルLSI設計(SystemC, SystemVerilog, etc.)の備忘録。はてなダイアリから移行中。

vscode+flake8

  • ExtentionにFlake8をインストールする

Flake8_vscode

{
    "editor.tabSize": 4,
    "python.analysis.extraPaths": [
        "./simple-test-gpnpu",
        "/usr/local/lib/python3.10/dist-packages/"
    ],
    "autoDocstring.docstringFormat": "numpy",
    "flake8.args": [
        "--ignore=W293, W503, W504, E111, E114, E129, E121",
        "--max-line-length=150",
        "--per-file-ignores=__init__.py:F401, E402"
    ]
}

CMake + Google Testの中規模プロジェクト作成

はじめに

ディレクトリ構成

Directory Note
include/${PROJECT_NAME} 公開ヘッダファイル
src ソースコード, 非公開ヘッダファイル
test テスト記述

GoogleTestのインストール

  • release-1.10.0を~/local/gtest-1.10.0にインストール
git clone https://github.com/google/googletest.git -b release-1.10.0 --depth=1
cd googletest
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=~/local/gtest-1.10.0 ..
make -j 8 install

プロジェクトのビルドと実行

git clone https://github.com/taksei/googletest_sample.git
cd googletest_sample
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_TEST=ON
make -j 8
# Run all tests
make test
# Run specified test
./test/test_sample

Linuxコマンド

つれづれに追加していきます。

指定した文字列をファイル名に含むファイルを検索する。

find -name "文字列" .

指定した文字列を内容に含むファイルを検索する。

grep "文字列" -rl .

テンポラリファイルを作成せずに、2つの生成した標準出力を比較する。

diff <(command1 )  <(command2)

重複する行を取り除く。

cat ${file} | sort | uniq

重複する行の数を出力する(CSV形式)。

cat ${file} | sort | uniq -c | sed "s/^\s\+//" | sed "s/\s\+/,/

特定文字で区切ったフィールドを抜き出す。

cat ${file} | cut -d ',' -f 3,4,8

GitリポジトリのHEADが示すコミットのSHAを出力する

git rev-parse HEAD

コード生成のためのヒアドキュメント利用

CSVで指定されたパラメータセットに応じてコードを自動生成するスクリプト
パラメータの取得はPython標準CSVパーサを利用。コード生成はヒアドキュメントに変数を埋め込むことで実現している。

#! /usr/bin/env python

import sys
import csv

#-----------------------------------------
# Load config.csv
#-----------------------------------------
args = sys.argv
with open(args[1]) as f:
  for row in csv.reader(f):
    if not row[0].startswith('#'):
      config = row

__P0 = int(config[0].replace(' ', ''))
__P1 = int(config[1].replace(' ', ''))
__P2 = int(config[2].replace(' ', ''))

#-----------------------------------------
# Generate param.h
#-----------------------------------------

str='''
#pragma once
#define PARAM0 {__p0}
#define PARAM1 {__p1}
#define PARAM2 {__p2}

const float A[PARAM0 * PARAM1] = {{
#include "./data/{__p0}_{__p1}.csv"
}}

const float B[PARAM1 * PARAM2] = {{
#include "./data/{__p1}_{__p2}.csv"
}}

float Y[PARAM0 * PARAM2];
'''.format(__p0=str(__P0), __p1=str(__P1), __p2=str(__P2)).strip()

print(str)

パラメータ設定ファイル例

# p0, p1, p2
5, 3, 4

Pythonのヒアドキュメントは'''と'''で囲んで作成する。
上記の記述例では、開始の'''の直後と、終了の'''の直前に改行が挿入されるため、stripにて前後の改行を取り除く。
ヒアドキュメント内の変数展開はformatメソッドを使用する。ヒアドキュメント内で{変数名}として展開する変数を記述する。なお、本来の{および}は変数と区別するため、{{、}}と書き換える。