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

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

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

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メソッドを使用する。ヒアドキュメント内で{変数名}として展開する変数を記述する。なお、本来の{および}は変数と区別するため、{{、}}と書き換える。