【python】レジスタビット文字列をバイト単位に分割する【文字列操作】

FPGA設計で必ず必要なレジスタ。毎回内容は異なりますが、回路としてはライト、リード、クリアとセットが出来れば良しと、定型化されています。

これ、フォーマットを決めたExcelか何かを用意して、そこからレジスタモジュールを自動生成出来るようなツールあったら便利じゃない?ポカミスも無くなりますし。と考えて現在作成中です。

自分が目標とするツールが吐き出すソースは業務と関連するのでそのままブログには書けませんが、それに必要なモジュールを細切れで記事にしていこうと思います。

使用言語

pythonを使います。理由は以下の通り。

  • スクリプト言語を1つ覚えたかった
  • Excelを簡単に読み込めそう
  • 機械学習でもよく使われているので勉強しておいて損はなさそう
  • 目標:レジスタビット文字列をバイト単位に分割

    レジスタビット文字列とは?

    自分が勝手に作った造語です。ここでは次のような文字列を指します。
    ex1. ’31:0′
    ex2. ’24:6′
    ex3. ’16’

    また、上記の例をバイト単位に分割するというのは次のような結果を指します。
    ex1. ’31:24′, ’23:16′, ’15:8′, ‘7:0′
    ex2. ’24’, ’23:16′, ’15:8′, ‘7:6′
    ex3. ’16’

    この分割は、普段使用しているレジスタモジュールがバイトイネーブル対応必須なために必要になります。

    ソースコード

    import math
    
    #==================================================
    # bit文字列を必要に応じ分割
    # ex1. '31:2' -> ['31:24','23:16','15:8','7:2']
    # ex2. '23' -> '23'
    #==================================================
    def getDivBit(str_bit):
        rtn_str = list()
        # ':'が含まれるかをチェック
        colon_index = str_bit.find(':')
        # 含まれない場合にはそのまま返す
        if (colon_index == -1):
            rtn_str.append(str_bit)
        # 含まれる場合はそのまま返すかバイト単位で分割
        else :
            # 最大最小を取得
            n_max_bit = int(str_bit[0:colon_index])
            n_min_bit = int(str_bit[colon_index+1:len(str_bit)])
            # 大きい方から検索する
            # 初期値は最大値
            n_bit = n_max_bit
            rtn_str = list()
            tmp_str = ''
            
            # 検索開始
            while (n_bit >= n_min_bit):
                # tmp_strが空の場合はバイト単位のスタート
                if (len(tmp_str) == 0):
                    # 24, 16, 8の場合はバイト単位で最後なので戻り値に1文字で追加
                    if (n_bit in [24, 16, 8]):
                        rtn_str.append(str(n_bit))
                    # 検索最終の場合も戻り値1文字で追加
                    elif (n_bit == n_min_bit):
                        rtn_str.append(str(n_bit))
                    # 区切りの数値でない場合はバイト単位の開始としてtmp_strへ追加
                    else:
                        tmp_str = str(n_bit)
                else:
                    # 24, 16, 8, 0の場合はバイト単位で最後なので':'と併せてtmp_strへ追加
                    # これでバイト単位で1つ完成
                    if (n_bit in [24, 16, 8, 0, n_min_bit]):
                        rtn_str.append(tmp_str + ':' + str(n_bit))
                        tmp_str = ''    # 次のためにtmp_strは初期化
                # 次のビット検索へ
                n_bit -= 1
    
        return rtn_str
    
    divBitResult = getDivBit('31:0')
    print (divBitResult)
    divBitResult = getDivBit('24:6')
    print (divBitResult)
    divBitResult = getDivBit('16')
    print (divBitResult)

    実行結果

    ['31:24', '23:16', '15:8', '7:0']
    ['24', '23:16', '15:8', '7:6']
    ['16']

    今回勉強したこと

  • 文字列はfind(‘*’)で指定文字が含まれるかどうかを検索できる。含まれればそのインデックスを返し、なければ-1が返る。
  • 文字列が空という判定は len(文字列)==0 で出来る。
  • ある数字が指定数字かどうかを判別するのに in [] が使える。
  • 文字列結合は単純に”+”。append()を使用するとリストとしての追加。
  • シェアする

    • このエントリーをはてなブックマークに追加

    フォローする