venv をつかって Polyphony を複数バージョンインストールする

#venv という Python の仮想環境
venv を使うと複数の Python の環境を構築できます。細かい話はいろんなところで書かれているので検索してみてください。私は
[VIRTUALENV について](http://blog1.erp2py.com/2011/07/virtualenv.html)
がわかりやすく読めました。

異なるバージョンの Python も構築できるようです。ここでは、Python のアプリケーションの一つの Polyphony (Python による高位合成) を複数インストールしてみます。

なお私の環境は cygwin + Python 3.4 + tcsh
## venv のインストール
pip3 install virtualenv
簡単!!

## 仮想環境の作成
pyvenv3 コマンドでつくります。ディレクトリは自動的に作ってくれます。

```txt
> pyvenv
pyvenv3    pyvenv-3.4
> pyvenv3 polyphony-0.2.2
> ls
polyphony-0.2.2
```
### [追記] pyvenv は deprecated
pyvenv は deprecatd なので venv を使います。

```txt
> python3.6 -m venv polyphony-0.2.2
> ls
polyphony-0.2.2/
```
あとはたぶん同じ。

## 仮想環境の実行
bin の下に activate.csh があるのでそれを実行します。bash の人はたぶん bin/activate を実行することになると思います。

```txt
> source polyphony-0.2.2/bin/activate.csh
[polyphony-0.2.2] >
```

## polyphony-0.2.2 のインストール
pip3 でインストールできます。インストール先は仮想環境です。

```txt
[polyphony-0.2.2] > pip3 install polyphony
Collecting polyphony
  Using cached polyphony-0.2.2.tar.gz
Installing collected packages: polyphony
  Running setup.py install for polyphony ... done
Successfully installed polyphony-0.2.2
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
[polyphony-0.2.2] >
```

### polyphony をちょっと実行 
Python のソースコードを掲げます。

```python:c_xor.py
from polyphony import testbench

class BitOp:
    def __init__(self, w0, w1, b):
        self.w0 = w0
        self.w1 = w1
        self.b = b

    def eval(self, x0, x1):
        tmp0 = self.w0 * x0
        tmp1 = self.w1 * x1
        tmp = tmp0 + tmp1 + self.b
        if tmp <= 0:
            return 0
        else:
            return 1

def AND(x1, x2):
    op = BitOp(5, 5, -7)
    return op.eval(x1, x2)

def OR(x1, x2):
    op = BitOp(5, 5, -2)
    return op.eval(x1, x2)

def NAND(x1, x2):
    op = BitOp(-5, -5, 7)
    return op.eval(x1, x2)

def XOR(x1, x2):
    AND = BitOp(5, 5, -7)
    OR = BitOp(5, 5, -2)
    NAND = BitOp(-5, -5, 7)
    s1 = NAND.eval(x1, x2)
    s2 = OR.eval(x1, x2)
    y = AND.eval(s1, s2)
    return y

@testbench
def test():
    print(XOR(0, 0))
    print(XOR(1, 0))
    print(XOR(0, 1))
    print(XOR(1, 1))

test()
```

これをまず python3 で実行

```txt
[polyphony-0.2.2] Persimmon:works> python c_xor.py
0
1
1
0
```

うまく動きました。polyphony で実行してみましょう。うまく verilog のコードが出来ました。

```txt
> polyphony c_xor.py
[polyphony-0.2.2] > ls
c_xor.py  polyphony_out.v  polyphony_out_test.v  polyphony_out_XOR.v
```

あとは iverilog でコンパイル・実行すればよいでしょう。うまく動いているようです。

```txt
> iverilog -I . -W all -o test -s test polyphony_out.v polyphony_out_test.v
> ./test
    0:XOR_0_in_x1=   x, XOR_0_in_x2=   x, XOR_0_out_0=   x
  110:XOR_0_in_x1=   0, XOR_0_in_x2=   0, XOR_0_out_0=   x
  280:XOR_0_in_x1=   0, XOR_0_in_x2=   0, XOR_0_out_0=   0
0
  290:XOR_0_in_x1=   1, XOR_0_in_x2=   0, XOR_0_out_0=   0
  460:XOR_0_in_x1=   1, XOR_0_in_x2=   0, XOR_0_out_0=   1
1
  470:XOR_0_in_x1=   0, XOR_0_in_x2=   1, XOR_0_out_0=   1
1
  650:XOR_0_in_x1=   1, XOR_0_in_x2=   1, XOR_0_out_0=   1
  820:XOR_0_in_x1=   1, XOR_0_in_x2=   1, XOR_0_out_0=   0
0
```

# polyphony-0.3.0 を別環境にインストール

まずは仮想環境の構築と実行

```txt
> pyvenv3 polyphony-0.3.0
> source polyphony-0.3.0/bin/activate.csh
[polyphony-0.3.0] > cd polyphony-0.3.0/
[polyphony-0.3.0] >
```

## polyphony-0.3.0 のインストール
開発中のバージョンなので github からブランチを指定して clone します。

```txt
[polyphony-0.3.0] > git clone -b 0.3.0 https://github.com/ktok07b6/polyphony/
Cloning into 'polyphony'...
remote: Counting objects: 2202, done.
remote: Compressing objects: 100% (230/230), done.
remote: Total 2202 (delta 121), reused 0 (delta 0), pack-reused 1972
Receiving objects: 100% (2202/2202), 954.49 KiB | 371.00 KiB/s, done.
Resolving deltas: 100% (1512/1512), done.
Checking connectivity... done.
[polyphony-0.3.0] > cd polyphony/
[polyphony-0.3.0] > git branch
* 0.3.0
[polyphony-0.3.0] > ls -l setup.py
-rw-r--r-- 1 ryos なし 481 3月  25 17:01 setup.py
[polyphony-0.3.0] > python3 setup.py install
ざっくり後略
```

その後
> python3 setup.py install

でうまくいくとおもったら、 setup.py の URL に書かれている情報を見るようです。なので、setup.py を書き直します。@以降が書き足した部分。

```python:setup.py
 url='https://github.com/ktok07b6/polyphony@0.3.0',
```

そして、

```txt
[polyphony-0.3.0] > python3 setup.py install
```

## 実行してみる
0.3.0 のあたらしい機能　io が使えるかどうか確認します。

```txt
[polyphony-0.3.0] > ./simu.py tests/io/
port01.py      port03.py      protocol01.py  protocol03.py
port02.py      port04.py      protocol02.py
[polyphony-0.3.0] > ./simu.py tests/io/port01.py
    0:p01_start=x, p01_in_valid=x, p01_out_valid=x, p01_out0=   x, p01_in0=   x
   10:p01_start=0, p01_in_valid=0, p01_out_valid=0, p01_out0=   0, p01_in0=   0
  110:p01_start=1, p01_in_valid=0, p01_out_valid=0, p01_out0=   0, p01_in0=   0
wait_rising out_valid
  120:p01_start=1, p01_in_valid=1, p01_out_valid=0, p01_out0=   0, p01_in0=   2
  140:p01_start=1, p01_in_valid=1, p01_out_valid=0, p01_out0=   4, p01_in0=   2
  150:p01_start=1, p01_in_valid=1, p01_out_valid=1, p01_out0=   4, p01_in0=   2
4
  200:finish
```

使えている気がします。これで、複数の環境を作ることが出来ました。

polyphony は env.py を修正すると 64bit の integer も生成可能です。少々面倒ですが、64bit 環境をべっと作っておくということも可能になります。