📦 Out of Context リポジトリ

リポジトリ / emssr / independent_common_compiler

r2

r2

Import independent_compile_test.zip (sha256 f47aaa95d54c)

emssr ・ 2026/10/15 12:55

← r1 この時点の trunk を zip

trunk/README.md
--- a/trunk/README.md	(revision 1)
+++ b/trunk/README.md	(revision 2)
@@ -1,10 +1,85 @@
-# independent_common_compiler
+# Common scope notebook
 
-(説明なし)
+Common 言語の平文を書き、commonc が組んだ内部表現を横で見るブラウザのアプリケーション。
 
-このリポジトリは **Subversion が正本**、Git は読み取り専用のミラーです。
+---
 
-* ブラウザで編集 / ファイルのアップロード: 画面上部の「編集」「アップロード」
-* SVN: `svn checkout https://repo.out-of-context.blog/svn/emssr.independent_common_compiler/trunk`
-* Git(読み取り専用): `git clone https://repo.out-of-context.blog/git/emssr.independent_common_compiler.git`
-* zip を渡して差分を取り込む: `ooc-repo push-zip ファイル.zip emssr/independent_common_compiler`
+## 1. 動かす
+
+必要なのは Python 3.8 以上。
+
+### Get Started
+
+```
+python server.py
+```
+
+Windows は `start.ps1`、macOS と Linux は `start.sh` でも同じ。ブラウザが開くはず。
+
+### repository から動かす場合
+
+```
+python setup.py        初回実行したい場合。runtime/ と vendor/pyodide/ を揃える(約 15 MB を取得)
+python server.py
+```
+
+二回目からは `server.py` だけでよい。
+
+| したいこと | |
+|---|---|
+| port を変える | `python server.py --port 9000` |
+| ブラウザを開かない | `python server.py --no-browser` |
+| 動作を確かめる | `python test_notebook.py` |
+| 図と動画を作り直す | `python figures.py`(matplotlib と ffmpeg を使う) |
+| 配布版フォルダを作る | `python setup.py --dist <出力先>` |
+
+network の無い PC へ入れるときは、別の PC で `python setup.py --vendor` を実行し、
+`vendor/` ごとコピーする。
+
+---
+
+## 2. VS Code 拡張を入れる
+
+`vscode/` フォルダを拡張の置き場へコピーする。
+
+**1. コピーする。**
+
+Windows(PowerShell):
+
+```powershell
+Copy-Item -Recurse vscode "$env:USERPROFILE\.vscode\extensions\common-scope"
+```
+
+macOS / Linux:
+
+```sh
+cp -r vscode ~/.vscode/extensions/common-scope
+```
+
+**2. VS Code を再起動する。**
+
+`.cmn` を開いて音節に色が付けば入っている。それ以上の機能がまだない...
+
+**3. コマンドパレット(Windows と Linux は `Ctrl+Shift+P`、macOS は `Cmd+Shift+P`)から呼ぶ。**
+
+| コマンド | |
+|---|---|
+| `Common scope: notebook を開く` | `server.py` を起動して VS Code の中に出す |
+| `Common scope: このファイルを全パネルへ送る` | `Ctrl+Enter` でも同じ |
+| `Common scope: パネルを一枚開く` | 層・DAG・ツイ数平面・lane64・接合秩 から選ぶ |
+| `Common scope: server を止める` | |
+
+### server.py が見つからないと言われたとき
+
+拡張は開いている workspace の下から `common_scope_notebook/server.py` を探す。
+別の場所へ置いたときは、設定にフォルダを絶対パスで書く。
+
+```json
+"commonScope.root": "C:\\tools\\common_scope_notebook"
+```
+
+| 設定 | 既定 | |
+|---|---|---|
+| `commonScope.root` | 空 | `common_scope_notebook` のフォルダ |
+| `commonScope.port` | 8787 | `server.py` の port |
+| `commonScope.python` | `python` | `server.py` を動かす実行ファイル |
Index: trunk/__pycache__/server.cpython-313.pyc
===================================================================
trunk/__pycache__/server.cpython-313.pyc
new file mode 100644
--- a/trunk/__pycache__/server.cpython-313.pyc	(nonexistent)
+++ b/trunk/__pycache__/server.cpython-313.pyc	(revision 2)
@@ -0,0 +1,219 @@
+�
+
+z�jq3���SrSSKrSSKrSSKrSSKrSSKrSSKrSSKJrJ	r	 \RR\RR\
+55r\RR\S5r\RR\S5r\RR\S5r\RR\S5rSrS	r"S
+S\5r\"5r0SS
+_SS
+_SS_SS_SS_SS_SS_SS_SS_SS_SS _S!S _S"S#_S$S%_S&S'_S(S)_S*S+_S,S-S.S/S0S1S2.ErS3r"S4S5\5rS6r\S7:Xa&\R<"\"\R>S8S55 gg)9u�Common scope notebook の web server。標準機能だけで書く。
+
+    python server.py                 8787 番で起動し、ブラウザを開く
+    python server.py --port 9000 --no-browser
+
+役目は三つ。
+
+  1. web/ の静的 file、notebooks/、assets/ の画像と動画を配る
+  2. 実行時のファイル(vcpu.py、toolchain.py、commonc の image…)を /runtime/ で配る。
+     ブラウザ側の Pyodide がこれを取り込んで lane64 を動かす
+  3. ウィンドウの同期。/events が Server-Sent Events、POST /state が書き込みになる
+
+ウィンドウを分けるのは表示量のためになる。lane の作業領域は交わらない(20 式 1.2)ので、
+ウィンドウごとに自分の kernel を持たせても state が混ざらない。同期するのは平文と初期値だけで、
+計算はそれぞれのウィンドウが自分で回す。
+�N)�SimpleHTTPRequestHandler�ThreadingHTTPServer�web�	notebooks�vendor�assetsc��[RR[S5nSn0nUHLn[RRX5n[RR	U5(dMHXBU'MN [U5[U5:XaU$[RR
+[RR[[R[R[R55n[RRUSSS5n[RRUSSS5n[RRUS5[RRUS	5[RRUS
+5[RRUS5[RRUSS
+S5[RRUSS5[RRUSS5[RRUSS5S.nUR5H6up4X2;dM[RR	U5(dM2XBU'M8 SH*n[RR[SU5X#'M, U$)N�runtime)�vcpu.py�vcpu_vec.py�lex.py�toolchain.py�commonc_lane64.bin�joinrank.bin�anf.bin�joinrank.dic�continuous_republic�common_systems�Python_vCPU�common_apps�joinrankrrr
+r�builds�commoncr�buildrrr�z
+generators.pyzscope.pyz
+session.pyzjoint.py�kernel)	�os�path�join�HERE�exists�len�abspath�pardir�items)	�local�names�out�n�p�root�vcpu_dir�jr�falls	         �	server.py�runtime_mapr0's����G�G�L�L��y�)�E�
+N�E�
+�C�
+���G�G�L�L��"��
+�7�7�>�>�!�����F���3�x�3�u�:���
+�
+�7�7�?�?�2�7�7�<�<��b�i�i����B�I�I�N�O�D��w�w�|�|�D�"7�9I�=�Y�H�	�����d�1�=�*�	M�B��7�7�<�<��)�4��w�w�|�|�H�m�<��'�'�,�,�x��2������X�~�>� �g�g�l�l�4��9�FZ�[������R��.�A��7�7�<�<��G�Y�7������R��^�D�	�D��
+�
+�����<�B�G�G�N�N�1�-�-���F��E�������d�H�a�0���E��J�c	�z�SVs0sH)nU[RR[SU5_M+ sn$s snf)Nrr)rrrr )r)s r/�
+kernel_mapr3HsA��L�N�L��
+�r�w�w�|�|�D�(�A�.�.�L�N�N��Ns�08c�0�\rSrSrSrSrSrSrSrSr	g)	�Hub�OuZいま編集している平文と種を持ち、繋がっているウィンドウへ配るc�X�SS0Ul/Ul[R"5Ulg)N�revr)�state�clients�	threading�Lock�lock��selfs r/�__init__�Hub.__init__Rs"���Q�Z��
+�����N�N�$��	r1c�z�UR [UR5sSSS5 $!,(df   g=f�N)r=�dictr9r>s r/�snapshot�Hub.snapshotWs��
+�Y�Y���
+�
+�#��Y�Y�s�,�
+:c��UR URRU5 URRSS5S-URS'S[R
+"URSS9-R
+S5n/nURH6nURU5 UR5 URU5 M8 X0lURSsSSS5 $![a Mef=f!,(df   g=f)Nr8r��
+data: %s
+
+F��ensure_ascii�utf-8)r=r9�update�get�json�dumps�encoder:�write�flush�append�	Exception)r?�patch�body�live�ws     r/�publish�Hub.publish[s���
+�Y�Y��J�J���e�$� $�
+�
+���u�a� 8�1� <�D�J�J�u��"�T�Z�Z��
+�
+��%O�O�W�W�X_�`�D��D��\�\����G�G�D�M��G�G�I��K�K��N�	"� �L��:�:�e�$��Y��!������Y�s0�B
+C=�2C,�
+C=�,
+C:�6C=�9C:�:C=�=
+Dc���UR URRU5 S[R"UR
+SS9-R
+S5sSSS5 $!,(df   g=f)NrIFrJrL)r=r:rTrOrPr9rQ)r?rYs  r/�attach�
+Hub.attachksH��
+�Y�Y��L�L����"�"�T�Z�Z��
+�
+��%O�O�W�W�X_�`��Y�Y�s�AA#�#
+A1)r:r=r9N)
+�__name__�
+__module__�__qualname__�__firstlineno__�__doc__r@rErZr]�__static_attributes__�r1r/r5r5Os��d�%�
+$�%� ar1r5z.jsztext/javascriptz.mjs�.jsonzapplication/jsonz.wasmzapplication/wasmz.cssztext/cssz.htmlztext/html; charset=utf-8z.woff2z
+font/woff2z.woffz	font/woffz.ttfzfont/ttfz.pngz	image/pngz.jpgz
+image/jpegz.jpegz.gifz	image/gifz.webpz
+image/webpz.svgz
+image/svg+xmlz.mp4z	video/mp4z.webmz
+video/webmz	video/oggz
+audio/mpegz	audio/wavz	audio/mp4zapplication/pdfztext/plain; charset=utf-8)z.ogvz.mp3z.wavz.m4az.pdfz.txtc��[R[RR	U5SR5S5$)NrH�application/octet-stream)�_MEDIArNrr�splitext�lower)rs r/�_mediarl�s1���:�:�b�g�g�&�&�t�,�Q�/�5�5�7�9S�T�Tr1c�V�\rSrSrSrSrSrSrSrSr	Sr
+S	rS
+rSr
+SrS
+rg)�Handler�c�D�[R"U/UQ7S[0UD6 g)N�	directory)rr@�WEB)r?�a�ks   r/r@�Handler.__init__�s�� �)�)�$�G��G�c�G�Q�Gr1c��grCre)r?�fmt�argss   r/�log_message�Handler.log_message�s��r1c�|�SUR5;aURSS5 [R"U5 g)N�
+Cache-Control�no-store)�_headers_buffer_names�send_headerr�end_headersr>s r/r��Handler.end_headers�s1���$�"<�"<�">�>����_�j�9� �,�,�T�2r1c�j�SR[US/5=(d /5RS5$)Nr1�_headers_bufferzlatin-1)r�getattr�decoder>s r/r~�Handler._headers_buffer_names�s+���x�x���&7��<�B��C�J�J�9�U�Ur1c�T�[R"USS9RS5nURS5 UR	SS5 UR	S[[
+U555 UR	SS	5 UR5 URRU5 g)
+NFrJrL���Content-Type�application/json; charset=utf-8�Content-Lengthr|r})
+rOrPrQ�
+send_responser�strr"r��wfilerR)r?�objrWs   r/�_json�
+Handler._json�s����z�z�#�E�2�9�9�'�B�����3������)J�K����)�3�s�4�y�>�:�����*�5������
+�
+����r1c���[US5R5nURS5 URSU5 URS[[U555 URSS5 UR5 URRU5 g![a5 URSS[R
+R
+U5-5 gf=f)	N�rb�u
+無い: %sr�r�r�r|r})�open�read�OSError�
+send_errorrr�basenamer�rr�r"r�r�rR)r?r�ctype�datas    r/�_file�
+Handler._file�s���	���d�#�(�(�*�D�	
+���3�������/����)�3�s�4�y�>�:�����*�5������
+�
+�������	��O�O�C�����0@�0@��0F�!F�G��	�s�B!�!<C �C c	�N�URRS5SnUS:XGa#[5nUR[	55 UR5VVs/sH-up4[RRU5(aM+UPM/ nnn[RR[RR[SS55n[RR[RR[SS55nUR[U5UU(aSOSU(aS	OSS
+.5 gURS5(aaU[S5Sn[5nUR[	55 X�;aURSS
+U-5 gUR!X(S5 gUS:Xa�[RR#[$5(dUR/5 g/n	[[R&"[$55H~nUR)S5(dM[*R,"[/[RR[$U5SS95n
+U	R1X:R3SU5S.5 M� URU	5 gURS5(a"UR!UR5U5S5 gUS:Xa$UR[6R955 gUS:XGaUR;S5 UR=SS5 UR=SS5 UR=SS5 UR?5 UR@RC[6REUR@55 UR@RG5 [6RJ UR@[6RL;nSSS5 W(dg[NRP"S 5 MVUS!:Xaw[RR#[R5=(d [RT"[R5 UR[[R&"[R555 gURS"5(ai[RR[R[RRWU[S"5S55nUR!U[YU55 gURS#5(a�[RR[U[S#5SR[S$[R\55n[RR_U5R[5(dURS%5 gUR!U[YU55 g[`Rb"U5 gs snnf![Ha gf=f!,(df   GN!=f)&N�?rz/api/runtime�pyodidez
+pyodide.jsrz
+marked.umd.jsz/vendor/pyodide/z/vendor/web/)�files�missingr�rz	/runtime/r�u配信の表に無い: %srhz/api/notebooksrfrL)�encoding�title)�filer��/api/notebook/r�z
+/api/statez/eventsr�r�z text/event-stream; charset=utf-8r|r}�
+Connectionz
+keep-aliveg�?z/api/assets�/assets/z/vendor/�/i�)2r�splitr0rMr3r%rr!�isfiler�VENDORr��sorted�
+startswithr"r�r��isdir�	NOTEBOOKS�listdir�endswithrO�loadr�rTrN�_nb_path�HUBrEr�rr�r�rRr]rSrUr=r:�time�sleep�ASSETS�makedirsr�rl�replace�sepr#r�do_GET)r?r*r�r)�qr�r&r�namer(�d�alives            r/r��Handler.do_GET�s5���I�I�O�O�C� ��#������M�E��L�L���&�%*�[�[�]�L�]�T�Q�"�'�'�.�.��:K�q�]�G�L��G�G�N�N�2�7�7�<�<��	�<�#P�Q�E��'�'�.�.������f�e�_�!M�N�C��J�J����7�9>�#5�D�14�~�$�@�
+A�
+��<�<��$�$��S��%�&�'�D��M�E��L�L���&�� �����%@�4�%G�H���J�J�u�{�$>�?��� � ��7�7�=�=��+�+��
+�
+�2����C��B�J�J�y�1�2���:�:�g�&�&��	�	�$�r�w�w�|�|�I�q�'A�G�"T�U�A��J�J��E�E�'�1�4E�F�G�3�
+�J�J�s�O���<�<�(�)�)��J�J�t�}�}�Q�'�)J�K������J�J�s�|�|�~�&���	�>����s�#����^�-O�P����_�j�9����\�<�8�����
+��
+�
+� � ����D�J�J�!7�8��
+�
+� � �"���X�X� �J�J�#�+�+�5�E�����
+�
+�3���
+�
+���G�G�M�M�&�!�8�R�[�[��%8���J�J�v�b�j�j��0�1�2���<�<�
+�#�#������V�R�W�W�%5�%5�a��J��8H�6I�%J�K�A��J�J�q�&��)�$���<�<�
+�#�#������V�Q�s�:��'7�%8�%@�%@��b�f�f�%M�N�A��7�7�?�?�1�%�0�0��8�8�����$���J�J�q�&��)�$�� �'�'��-��WM��^�
+��
+���X�s+�*W?�
+W?�:AX�X�
+X�X�
+X$c���[RRURS5S5nUR	S5(dUS-
+n[RR[U5$)Nr������rf)rrr�r�r�rr�)r?r*r�s   r/r��Handler._nb_pathsR���w�w������(8� 9�"� =�>���}�}�W�%�%��G�O�D��w�w�|�|�I�t�,�,r1c���[URRSS55n[R"UR
+R
+U5RS55$)Nr�rrL)�int�headersrNrO�loads�rfiler�r�)r?r)s  r/�_body�
+Handler._bodysE������ � �!1�1�5�6���z�z�$�*�*�/�/�!�,�3�3�G�<�=�=r1c�*�URRS5SnUS:Xa8UR5nURS[RU505 gURS5(Ga?[RRU[S5S5nU(dUR	SS5 g[URRS	S55nUS
+:�aUR	SS5 g[RR[ 5=(d [R""[ 5 [%[RR'[ U5S
+5nUR)UR*R-U55 SSS5 URSSU-05 gURS5(a�UR5n[RR[.5=(d [R""[.5 UR1U5n[%USSSS9n[2R4"XeSSS9 UR)S5 SSS5 URS[RRU505 gUR	S5 g![a UR	SS5 gf=f!,(df   GNC=f![a UR	SS5 gf=f!,(df   N�=f)Nr�rz/statei�uJSON ではありませんr8r�u名前がありませんr�ii�u64 MB を越えています�wbrzassets/r�rYrL�
+)r��newlineF�)rK�indentr�r�)rr�r��
+ValueErrorr�r�r�rZr�rr�r"r�r�rNr�r�r�r�rrRr�r�r�r�rO�dump)r?r*rVr�r)�f�docrs        r/�do_POST�Handler.do_POSTsE���I�I�O�O�C� ��#����=�
+��
+�
+���
+�J�J��s�{�{�5�1�2�3���<�<�
+�#�#��7�7�#�#�A�c�*�o�&6�$7�8�D������%?�@���D�L�L�$�$�%5�q�9�:�A��#�#�����%B�C���G�G�M�M�&�!�8�R�[�[��%8���b�g�g�l�l�6�4�0�$�7�1�����
+�
+����*�+�8��J�J��	�D� 0�1�2���<�<�(�)�)�
+��j�j�l��
+�G�G�M�M�)�$�>����I�(>���=�=��#�D��d�C�'�4�@�A��	�	�#�u�Q�?�����
+�A�
+�J�J����� 0� 0�� 6�7�8��������C�
+�����%A�B��
+��8�7���
+�����%A�B��
+��
+A�@�s;�J.�)+K�
+K"�;(L�.K
+�K
+�
+K�"L�L�
+Lc��URRS5SnURS5(dURS5 gUR	U5n[
+RR
+U5(a[
+R"U5 URS[
+RRU505 g)Nr�rr�r�r�)
+rr�r�r�r�rr!�remover�r�)r?r*rs   r/�	do_DELETE�Handler.do_DELETE8s����I�I�O�O�C� ��#���|�|�,�-�-��O�O�C� ���}�}�Q���
+�7�7�>�>�$����I�I�d�O��
+�
+�F�B�G�G�,�,�T�2�3�4r1reN)r_r`rarbr@ryr�r~r�r�r�r�r�r�r�rdrer1r/rnrn�s>��H�
+�3�V�
+��Q.�p-�>�&�P5r1rnc�^
+�Sup[U5nUH8nUS:Xa[[U55nMUS:XaSnM)[[5  g [5nUR
+[55 UR5VVs/sH-upg[RRU5(aM+UPM/ nnnU(a([SSRU5-5 [S5 S	U-m
+[S
+U4[5n	SU	l[ST
+-5 [S
+T
+-5 U(a)[ R""SU
+4Sj5R%5 U	R'5 gs snnf![(a [S5 gf=f)N)iS"Tz--portz--no-browserFr�u配れないファイル: %sz, u>  setup.py を実行するか、runtime/ へコピーを置くzhttp://127.0.0.1:%d/z	127.0.0.1TzCommon scope notebook  %suj  パネルを別ウィンドウで開く: %s?pane=dag  ?pane=chamber  ?pane=tsui  ?pane=lane  ?pane=jointg�������?c�0>�[R"T5$rC)�
+webbrowserr�)�urls�r/�<lambda>�main.<locals>.<lambda>Zs���Z�_�_�S�%9r1�r)�iterr��next�printrcr0rMr3r%rrr!rrrn�daemon_threadsr;�Timer�start�
+serve_forever�KeyboardInterrupt)�argv�port�open_browser�itrsr�r)r*r��srvr�s          @r/�mainr�Cs@���#��D�	
+�d��B�
+����=��t�B�x�=�D�
+�.�
+ � �L��'�N���
+�M�E�	�L�L����"�[�[�]�D�]�T�Q�"�'�'�.�.��2C�q�]�G�D��
+�,�t�y�y��/A�A�B�
+�N�O�
+ �4�
+'�C�
+�{�D�1�7�
+;�C��C��	�
+%��
++�,�	�
+v�y|�
+|�}������9�:�@�@�B������
+��E����
+�b�	���s�*E'�3E'�E-�-F�F�__main__rH) rcrOr�sysr;r�r��http.serverrrr�dirnamer#�__file__r rrrr�r�r�r0r3�objectr5r�rirlrnr�r_�exitr�rer1r/�<module>r�s����"�	�
+����E�	�w�w���r�w�w���x�0�1���g�g�l�l�4�����G�G�L�L��{�+�	�	�����d�H�	%��	�����d�H�	%���BN�a�&�a�D
+�e��	
+�	��	
+�$�&7�	
+�9@�BT�	
+��
+�	
+�!'��	
+�5<�>X�	
+�
+�l�	
+�$�[�	
+�39�*�	
+��K�		
+� ��		
+�07��		
+�
+�K�	
+�
+!�,�	
+�
+17��	
+��K�
+	
+�!�,�
+	
+�9D��+�{��'B�	
+��U�{5�&�{5�|
+�>�z���H�H�T�#�(�(�1�2�,�
+� �r1
\ No newline at end of file
Index: trunk/__pycache__/setup.cpython-313.pyc
===================================================================
trunk/__pycache__/setup.cpython-313.pyc
new file mode 100644
--- a/trunk/__pycache__/setup.cpython-313.pyc	(nonexistent)
+++ b/trunk/__pycache__/setup.cpython-313.pyc	(revision 2)
@@ -0,0 +1,130 @@
+�
+
+z�j�"��4�SrSSKrSSKrSSKrSSKrSSKr\RR\RR\
+55r\RR\S5r
+\RR\SS5r\RR\SS5r\RR\S5rSrS	rS
+rSrSrS
+rSrSSjrSrSrSrSrSSjrSrSrSr Sr!Sr"\#S:Xa&\RH"\""\RJSS55 gg)u�このフォルダだけで動くようにファイルを揃える。標準機能だけで書く。
+
+    python setup.py              runtime/ を揃え、Pyodide をこのフォルダへコピーする
+    python setup.py --runtime    runtime/ だけ
+    python setup.py --vendor     Pyodide と web の library だけ
+    python setup.py --version 314.0.7    版を指定する
+    python setup.py --dist <DIR>         配布用フォルダを作る
+
+揃うもの。
+
+    runtime/         lane64 の実行台と commonc の image。server.py がここから配信する
+    vendor/pyodide/  ブラウザの中の CPython。約 15 MB
+    vendor/web/      marked(Markdown)と KaTeX(数式)。約 0.6 MB
+
+Pyodide の版は npm の registry へ訊く。CDN の `full/` には wheel も揃っているので、
+そこから四本と numpy の wheel を取る。numpy は束ねの道(vcpu_vec)が使う。
+�N�runtime�vendor�pyodide�web�assetsz)https://registry.npmjs.org/pyodide/latestz*https://cdn.jsdelivr.net/pyodide/v%s/full/)z
+pyodide.jszpyodide.mjszpyodide.asm.mjszpyodide.asm.wasmzpython_stdlib.zip�pyodide-lock.json))zvcpu.pyz6continuous_republic/common_systems/Python_vCPU/vcpu.py)zvcpu_vec.pyz:continuous_republic/common_systems/Python_vCPU/vcpu_vec.py)zlex.pyz5continuous_republic/common_systems/Python_vCPU/lex.py)ztoolchain.pyz;continuous_republic/common_systems/Python_vCPU/toolchain.py)zcommonc_lane64.binz!builds/commonc/commonc_lane64.bin)zjoinrank.dicz>continuous_republic/common_apps/joinrank/joinrank/joinrank.dicc���[RR[RR[[R
+[R
+[R
+55$�N)�os�path�abspath�join�HERE�pardir���setup.py�rootr0s4��
+�7�7�?�?�2�7�7�<�<��b�i�i����B�I�I�N�O�Orc�D�[S[RRU5-5 [R
+R
+U5n[US5n[R"X#5 SSS5 SSS5 g!,(df   N=f!,(df   g=f)N�  %s�wb)
+�printrr�basename�urllib�request�urlopen�open�shutil�copyfileobj)�urlr�r�fs    r�getr#4sd��	�&�2�7�7�#�#�D�)�
+)�*�	���	�	��	$��4��d�+;�q����1� �,<�	$�	$�+;�+;��	$�	$�s$�
+B�B�/B�
+B	�
+B�
+Bc	���[RR[5=(d [R"[5 [5n/n[GH	up#[RRXRS[R55n[RRU5(aI[R"U[RR[U55 [SU-5 M�[RR[RR[U55(aM�URU5 GM SH�n[RR[U5n[RRU5(aMM[RRUSSSSU5n[RRU5(a&[R"Xe5 [SU-5 M�URSU-5 M� U(a#[S	5 UHn[SU-5 M g
+g)N�/r)zjoinrank.binzanf.bin�continuous_republic�common_apps�joinrank�buildu/%s(common_apps/joinrank/build.py で作る)u揃わなかったもの:�r)rr�isdir�RUNTIME�makedirsr�SOURCESr�replace�sep�existsr�copyfiler�append)�R�miss�name�rel�src�dst�built�ms        rrr<s����G�G�M�M�'��2�b�k�k�'�2����A�
+�D��W�	���g�g�l�l�1�k�k�#�r�v�v�6�7��
+�7�7�>�>�#����O�O�C������g�t�!<�=��&�4�-� �����������W�d� ;�<�<��K�K���
+�,���g�g�l�l�7�D�)��
+�7�7�>�>�#���������Q� 5�}�j�$�d�,��
+�7�7�>�>�%� � ��O�O�E�'��&�4�-� ��K�K�I�D�P�Q�,��
+�)�*��A��&�1�*����rc�X�UcE[RR[5n[R
+"U5SnSSS5 [U-n[RR[5=(d [R"[5 [SU-5 [H3n[X#-[RR[U55 M5 [R
+"[![RR[S5SS95nUSSSn[X%-[RR[U55 [![RR[S	5S
+5R#U5 g!,(df   GN`=f)N�versionz
+Pyodide %sr�utf-8)�encoding�packages�numpy�	file_name�version.txt�wr)rrr�REGISTRY�json�load�CDNrrr+�VENDORr-r�COREr#rr�write)r=r!�base�n�lock�wheels      rrr\s����
+�^�^�
+#�
+#�H�
+-���i�i��l�9�-�G�.���=�D��G�G�M�M�&��0�R�[�[��0��	�,��
+ �!�
+���D�H�b�g�g�l�l�6�1�-�.���9�9�T�"�'�'�,�,�v�/B�C�g�V�W�D����W�%�k�2�E����b�g�g�l�l�6�5�1�2�������f�m�	,�c�2�8�8��A��.�
+-�s�F�
+F)z8https://cdn.jsdelivr.net/npm/marked@%s/lib/marked.umd.jsz-https://cdn.jsdelivr.net/npm/katex@%s/dist/%s)zKaTeX_AMS-RegularzKaTeX_Caligraphic-BoldzKaTeX_Caligraphic-RegularzKaTeX_Fraktur-BoldzKaTeX_Fraktur-RegularzKaTeX_Main-BoldzKaTeX_Main-BoldItaliczKaTeX_Main-ItaliczKaTeX_Main-RegularzKaTeX_Math-BoldItaliczKaTeX_Math-ItaliczKaTeX_SansSerif-BoldzKaTeX_SansSerif-ItaliczKaTeX_SansSerif-RegularzKaTeX_Script-RegularzKaTeX_Size1-RegularzKaTeX_Size2-RegularzKaTeX_Size3-RegularzKaTeX_Size4-RegularzKaTeX_Typewriter-Regularc��[RRSU-5n[R"U5SsSSS5 $!,(df   g=f)Nz$https://registry.npmjs.org/%s/latestr=)rrrrFrG)r6r!s  r�latestrQ~s:��	���	�	� F�� M�	N�RS��y�y��|�I�&�
+O�	N�	N�s�A�
+Ac
+���U=(d [S5nU=(d [S5n[RR[RR	[
+S55=(d8 [R"[RR	[
+S55 [SU<SU<35 [[U-[RR	[
+S55 SH9n[[X4-[RR	[
+U55 M; [[US4-[RR	[
+S	55 [HDn[[US
+U-S-4-[RR	[
+SUS-55 MF [[RR	[
+S5S
+5RSU<SU<S35 g)N�marked�katex�fontszmarked z	 / KaTeX z
+marked.umd.js)zkatex.min.jsz
+katex.min.csszcontrib/auto-render.min.jszauto-render.min.jszfonts/z.woff2rCrDz
+katex �
+r)rQrrr+r�WEBr-rr#�MARKED�KATEX�KATEX_FONTSrrK)�marked_v�katex_vrMr"s    rrr�sI���+�6�(�+�H��(����G��G�G�M�M�"�'�'�,�,�s�G�,�-�X����R�W�W�\�\�#�w�=W�1X��	�H�g�
+6�7�����2�7�7�<�<��_�=�>�
+.���E�W�L� �"�'�'�,�,�s�A�"6�7�/����6�7�7�
+�����S�.�/�1�
+���E�W�h��l�X�5�6�6��G�G�L�L��g�q�8�|�4�	6��	������c�=�	)�3�/�5�5�#+�W�5�7�r)z	server.pyzsetup.pyztest_notebook.pyz	README.md)�kernelr�	notebooks�vscoderrrz'tools/independent_compile_test/examplesc��[5(ag[RR[5(d[S5 g[RRU5=(d [R"U5 [HYn[R"[RR[U5[RRX55 M[ [H�n[RR[U5n[RRU5(dMM[R"U[RRX5S[R"SSS5S9 M� [RR"[5/[ R#S5Q76n[RRU5(aJ[R"U[RRUS	5S[R"SS5S9 [%[RRUS
+5SSS
+S9R'S5 [%[RRUS5SSSS9R'S5 [)S[R*"U555n[)S[R*"U555n[SXUS-4-5 g)Nr*uXvendor/ がありません。先に python setup.py --vendor を実行してくださいT�__pycache__z*.pycz	_cell.dic)�
+dirs_exist_ok�ignorer%�examplesz	start.ps1rDr>z
+)r?�newlineuy# Common scope notebook を起動する
+$here = Split-Path -Parent $MyInvocation.MyCommand.Path
+python "$here\server.py"
+zstart.shrVu`#!/bin/sh
+# Common scope notebook を起動する
+exec python3 "$(dirname "$0")/server.py" "$@"
+c3�># �UHupn[U5v� M g7fr
+)�len)�.0�_b�_dr"s    r�	<genexpr>�dist.<locals>.<genexpr>�s���1�L�y�r�q�C��F�F�L�s�c3�# �UHMupo3HAn[RR[RRX55v� MC MO g7fr
+)rr�getsizer)rh�brj�fsr"s     rrkrl�sD���:� ,�9�1�"�b���w�w���r�w�w�|�|�A�1�2�2�68�3� ,�s�AAu%s   %d ファイル   %.1f MBg��.Ar)rrrr+rIrr-�APPrr2rr�TREES�copytree�ignore_patternsr�EXAMPLES�splitrrK�sum�walk)r9rMr8�ex�sizes     r�distr{�s����y�y��
+�7�7�=�=�� � �
+�h�i���G�G�M�M�#��*�"�+�+�c�*��
+����������T�1�-�r�w�w�|�|�C�/C�D��
+���g�g�l�l�4��#���w�w�}�}�S�!�!������R�W�W�\�\�#�1��%�5�5�m�W�k�Z�	\�	�
+�����d�f�	3�x�~�~�c�2�	3�B�	�w�w�}�}�R�������B�G�G�L�L��j�9��%�5�5�m�W�M�	O�������c�;�	'��w��O�U�U�	(�)�	������c�:�	&��g�t�L�R�R�	:�;�	�1�B�G�G�C�L�1�1�A��:� "�����:�:�D�	�
+*�c�d�S�j�-A�
+A�B�rc�0�S=pSn[U5nUHrnUS:XaSnM
+US:XaSnMUS:Xa
+[U5nM*US:Xa3[[RR[U555s $[
+[5  g SnU(a[
+S	5 U[5-nU(a[U5 [5 U(d[
+S
+5 [
+S5 U$![a%n[
+S
+U-5 [
+S5 SnSnANISnAff=f)NTz	--runtimeFz--vendorz	--versionz--dist�ruruntime/ を揃えますulibrary を取れません: %suf  network が無い場所では、別の PC で --vendor を実行して vendor/ をコピーしますr*�u起動:  python server.py)�iter�nextr{rrr
+r�__doc__rrr�	Exception)�argv�do_rt�do_ver=�it�a�bad�es        r�mainr��s�����E��G�	
+�d��B�
+������E�
+�*�_��E�
+�+�
+��2�h�G�
+�(�]��������R��1�2�2��'�N����C��
+�(�)��w�y����	��7�O��E�
+�
+�b�	�
+�)�*��J���	��2�Q�6�7��z�{��C��	�s�2C&�&
+D�0D�D�__main__r*r
+)NN)&r�rFrr�sys�urllib.requestrr�dirnamer
+�__file__rrr,rIrW�ASSETSrErHrJr.rr#rrrXrYrZrQrrqrrrur{r��__name__�exitr�rrr�<module>r�s"���$�	�
+�
+��	�w�w���r�w�w���x�0�1��
+�'�'�,�,�t�Y�
+'��	�����d�H�i�	0���g�g�l�l�4��5�)��	�����d�H�	%��6��2��2����P�!�
+�@
+
+�*
+D��7����'�
+
+�4A��O��4��
+�D�D�z���H�H�T�#�(�(�1�2�,�
+� �r
\ No newline at end of file
Index: trunk/__pycache__/test_notebook.cpython-313.pyc
===================================================================
trunk/__pycache__/test_notebook.cpython-313.pyc
new file mode 100644
--- a/trunk/__pycache__/test_notebook.cpython-313.pyc	(nonexistent)
+++ b/trunk/__pycache__/test_notebook.cpython-313.pyc	(revision 2)
@@ -0,0 +1,79 @@
+�
+
+���j-����SrSSKrSSKrSSKr\RR\RR
+\55rSHMr	\RR\\	5r\\R;dM1\RRS\5 MO SSK
+rSSKr\R "\RR\SS55 /rSr
+SrSr\S	:Xa\R*"\"55 gg)
+u#notebooks/ の全セルを compile して実行する。
+
+    python test_notebook.py
+
+ブラウザを立てずに kernel だけを確かめる。報告が tu でないセルと、語と箱の
+対応が崩れたセルを数えて返す。接合秩を宣言したセルは ρ まで取る。
+�N)�runtime�kernelrzcommonc_lane64.binc�R�[(d�[R[R"[R
+R
+[SS5[R
+R
+[SS5[R
+R
+[SS555 [S$)Nrzjoinrank.binzjoinrank.diczanf.binr)�_J�append�	joint_mod�Joint�os�path�join�HERE���test_notebook.py�jointrsf��
+�2�
+�	�	�)�/�/�"�'�'�,�,�t�Y��"O�"$�'�'�,�,�t�Y��"O�"$�'�'�,�,�t�Y�	�"J�L�	M��a�5�Lrc�N�US(dgSRSUS55$)N�gammau(空)�  c3�h# �UH(nSUSUSS:XaUSOSUSUS4-4-v� M* g7f)u語%d=%s�word�den��numz%d/%dNr)�.0�gs  r�	<genexpr>�gamma.<locals>.<genexpr>&sN���+�)�� �1�V�9�!�E�(�a�-�a��h�'.�!�E�(�A�e�H�1E�'E�#G�G�)�s�02)r)�scs rrr#s.��
+�g�;���9�9�+� ��k�+�+�+rc
+�r�Sn[[R"[RR	[
+S555GHFnUR
+S5(dM[R"[[RR	[
+SU5SS95n[SU<SUS<35 [US	5GH�up4URS
+5S:waMSUS
+--n[R"USURS5URS5URS5=(d [RS9nURS5S:Xa[SU-5 US
+-
+nSnUSS:waUSUS--
+nUS
+-
+nUSS(dUSUSS--
+n[S U[%U5US!S"US!S#US$U4-5 URS%5(dGM'[R&"USURS55up�n[R("X�S%5n[+5"U[-US%5URS&[-US%5S'-55n
+[S(U
+S)U
+S&U4-5 GM� GMI S*n[R"U5nUSS:wdUS+SS'S
+S,/:wa[S-US+SS'-5 US
+-
+nO[S.U<S/US+SS'<35 [S5 [S1U-5 U(aS
+$S$![R aWnURS5S:Xa[U<S[#U5SS<35 O[U<SU<35 US
+-
+nSnAGM�SnAff=f![R an[S0U-5 US
+-
+nSnAN�SnAff=f)2Nr�	notebooksz.jsonzutf-8)�encodingz=== r�title�cells�kind�cmnz  [%d]r�source�dic�seeds�words)r'r(r)�expect�failu' 誤りの見本として止まった: �4u
+  失敗: u(%s  誤りの見本のはずが通った��reportu  報告 %s�align�oku  対応なし(%s)�whyu %s %-34s 音節%-4d 箱%-5d %s%s�size�syl�box�mark�inputs�cut�u,       接合秩 ρ=%d  カット=%d  表=%s�rhoz.we re ka, ki sa ka, ki si ka, ki wi ka, gi ka.�out�����u4  [回帰] ツイ数平面: 実行結果が違う %su  [回帰] ツイ数平面: u → u&  [回帰] ツイ数平面: 失敗: %su閉じなかったセル: %d)�sortedr
+�listdirrrr
+�endswith�json�load�open�print�	enumerate�get�session�cell�
+DEFAULT_WORDS�	CellError�strr�compile_text�verticesr�len)�bad�name�nb�i�c�headr�e�note�image�_n�_m�tbl�r�planes               r�mainr[+sl��
+�C��r�z�z�"�'�'�,�,�t�[�"A�B�C���}�}�W�%�%��
+�Y�Y�t�B�G�G�L�L��{�D�A�G�T�
+U��
+�d�B�w�K�0�1��b��k�*�D�A��u�u�V�}��%���q�1�u�%�D�
+
+��\�\�!�H�+�2�6�6�%�=�()���g��()���g��(O�'�:O�:O�Q���u�u�X��&�(��@�4�G�H��q����D��(�|�q� ��
+��8��4�4���q����g�;�t�$��0�2�g�;�u�3E�E�E���4��5��9�b��j��&7��F��E�9J���Z��'�'�
+(��u�u�X��� '� 4� 4�Q�x�[�"�&�&��-� P�
+��2��&�&�u��k�:���G�C��Q�x�[�!1�1�5�5���A�h�K�@P�TU�@U�3V�W���D��%��RS�TY�RZ�\_�G`�`�a�?+�D�N
+=�E�	�
+�\�\�%�
+ ��
+�h�<�1���5�	�"�1�
+�!�R�� 8��H�2�e�9�UW�VW�=�X�Y��1�H�C��U�B�u�I�b�q�M�R�S�
+
+�"�I�	�
+(�3�
+.�/��1�����Q�$�$�
+��5�5��?�f�,��4�QT�UV�QW�X[�Y[�Q\�]�^��d�A�6�7��1�H�C���
+
+��D����
+�6��:�;��q�����s9�+AL�AN�N�N�+AM=�=N�N6�N1�1N6�__main__)�__doc__r?r
+�sysr�dirname�abspath�__file__r
+�dr�p�insertrrrE�startrrr[�__name__�exitrrr�<module>rhs�����	�
+�	�w�w���r�w�w���x�0�1��	�A�
+�����T�1��A������������1��
+�
+���
+�
+�b�g�g�l�l�4��,@�A�B����+�7�t�z���H�H�T�V��r
\ No newline at end of file
Index: trunk/assets/cmn_lang_ref/Index.md
===================================================================
trunk/assets/cmn_lang_ref/Index.md
new file mode 100644
--- a/trunk/assets/cmn_lang_ref/Index.md	(nonexistent)
+++ b/trunk/assets/cmn_lang_ref/Index.md	(revision 2)
@@ -0,0 +1,103 @@
+# cmn 言語リファレンス
+
+`.cmn` は Common 言語の source である。中身はコモン公用語の平文そのものになる。
+
+$$
+\boxed{\ \texttt{.cmn}\;=\;E_{\mathrm{speech}}(C_P)\;\in\;\Sigma^*\ }
+\tag{1.1}
+$$
+
+$C_P$ は文章全体のチェンバー、$\Sigma$ は 70 音節の表である。読みはその復号になる。
+
+$$
+D_{\mathrm{text}}=D_{\mathrm{speech}}\circ\operatorname{filter}_\Sigma
+\tag{1.2}
+$$
+
+$\operatorname{filter}_\Sigma$ が音節でない字を落とすので、空白・改行・句読点はどこへ置いてもよい。
+
+---
+
+## 最初の一本
+
+```
+hu hu ka
+no ka
+```
+
+値は $2$ になる。読み方はこうなる。
+
+| 音節 | 何が起きるか |
+|---|---|
+| `hu` | $\mathsf{one}$。$1$ を一本立てる |
+| `hu` | もう一本立てる |
+| `ka` | 層を閉じる |
+| `no` | $\oplus$。左から二本を取って足す |
+| `ka` | 層を閉じる |
+
+走らせる。
+
+```bash
+common continuous_republic/examples/cmn/futatsu.cmn --run
+```
+
+---
+
+## 三つの規則
+
+書式の全部が三行で終わる。
+
+1. 音節表 $\Sigma$ の元だけが意味を持つ
+2. 層境界音 `ka` が層を切り、無声ワイヤ音 `ki` が恒等箱ひとつを表す
+3. $\Gamma^-=I$、$\mu=\infty$
+
+数字も括弧もラベルも変数名も現れない。定数は $\mathsf{one}$ と算術の合成で作る。
+
+$$
+2=1\oplus1,\qquad
+0=1\oplus(\ominus1),\qquad
+\tfrac12=\beta(0),\qquad
+\tfrac34=\beta(\beta(0))
+$$
+
+---
+
+## 読む順
+
+| | 内容 |
+|---|---|
+| [language/01_source](language/01_source.md) | 音節・層・frontier。平文が疎テンソルになる仕組み |
+| [language/02_boundary](language/02_boundary.md) | 境界と型。どの箱がどこに置けるか |
+| [language/03_intent](language/03_intent.md) | 意図の判定条件 $H(C)=\varnothing$ |
+| [generators/Index](generators/Index.md) | 生成元 69 語の総表 |
+| [toolchain/01_build](toolchain/01_build.md) | compile して走らせる |
+| [toolchain/02_targets](toolchain/02_targets.md) | target と実行台 |
+
+## 層ごとの入口
+
+生成元は境界の型で六つに分かれる。
+
+| 層 | 型 | 頁 |
+|---|---|---|
+| 二進有理数 | $\mathsf{Dyad}=\mathbb Z[1/2]$ | [generators/dyad](generators/dyad.md) |
+| 判定値 | $\mathcal Q$ | [generators/judge](generators/judge.md) |
+| ツイ数平面 | $\mathsf{Trace}$、$\mathsf{Point}$、$\mathsf{Reflection}$ | [generators/plane](generators/plane.md) |
+| 名詞 | $\mathsf{Noun}$ | [generators/noun](generators/noun.md) |
+| 領域 | $\mathsf{Region}$、$\mathsf{Chain}$ | [generators/region](generators/region.md) |
+| 実行台 | 作業領域と外部環境 | [generators/machine](generators/machine.md) |
+
+## 出典
+
+この頁の式は次の文書から取る。
+
+| 記号 | 文書 |
+|---|---|
+| 16 | `docs/common-compiler/16_平文がプログラムになる条件.md` |
+| 13 | `docs/common-compiler/13_Common言語のソース書式.md` |
+| 10 | `docs/common-compiler/lang/10_意味レジストリとコモン公用語の字体.md` |
+| 19 | `docs/common-compiler/program/19_commonc.md` |
+| 06 | `docs/common_national_language/06_音声符号と誤り訂正.md` |
+| 07 | `docs/common_national_language/07_名詞と影響ネットワーク.md` |
+| 構成語 | `docs/Common-Lang/Common言語のチェンバー構文と構成語の意味的正規形.md` |
+| 幾何 | `docs/幾何連合論理集合/Index.md` |
+| 影響関数 | `docs/幾何連合論理集合/ツイ数平面とか/4. 影響関数と整合条件.md` |
Index: trunk/assets/cmn_lang_ref/generators/Index.md
===================================================================
trunk/assets/cmn_lang_ref/generators/Index.md
new file mode 100644
--- a/trunk/assets/cmn_lang_ref/generators/Index.md	(nonexistent)
+++ b/trunk/assets/cmn_lang_ref/generators/Index.md	(revision 2)
@@ -0,0 +1,114 @@
+# 生成元の総表
+
+[← Index](../Index.md)
+
+生成元は 69 語ある。名前は式 (1.2) がレジストリ順から決めるので、命名は無い。
+
+型の略記:$D=\mathsf{Dyad}$、$B=\mathsf{Bit}$、$P=\mathsf{Point}$、$T=\mathsf{Trace}$、
+$R=\mathsf{Reflection}$、$N=\mathsf{Noun}$、$Q=\mathcal Q$、$G=\mathsf{Region}$、
+$C=\mathsf{Chain}$、$Q_r=\mathsf{Rational}$、$I$ は単位境界。
+
+| # | 音節 | 記号 | $\Gamma^-\to\Gamma^+$ | 意味 | 頁 |
+|---:|---|---|---|---|---|
+| 0 | `ke` | $\mathrm{id}$ | $T\to T$ | 恒等道 | [plane](plane.md) |
+| 1 | `ko` | $\mathrm{id}_{\mathrm{coord}}$ | $P\to P$ | 座標の恒等道 | [plane](plane.md) |
+| 2 | `sa` | $i$ | $T\to T$ | 構成生成元 $i$ | [plane](plane.md) |
+| 3 | `si` | $j$ | $T\to T$ | 構成生成元 $j$ | [plane](plane.md) |
+| 4 | `su` | $\ominus$ | $T\to T$ | 履歴の負化 | [plane](plane.md) |
+| 5 | `se` | $\beta$ | $D\to D$ | 二分割 $(x+1)/2$ | [dyad](dyad.md) |
+| 6 | `so` | $\varphi_\partial$ | $D\to B$ | 観測 $[0<x]$ | [dyad](dyad.md) |
+| 7 | `ta` | $\oplus_{\mathrm{coord}}$ | $P\otimes P\to P$ | 座標の加算 | [plane](plane.md) |
+| 8 | `ti` | $\star$ | $D\otimes D\to D$ | 乗算 | [dyad](dyad.md) |
+| 9 | `tu` | $\Delta_{\mathsf{Noun}}$ | $N\to N\otimes N$ | 名詞の複製($\mu=\infty$ で不可) | [noun](noun.md) |
+| 10 | `te` | $!_{\mathsf{Noun}}$ | $N\to I$ | 名詞の廃棄 | [noun](noun.md) |
+| 11 | `to` | $\Leftrightarrow$ | $D\otimes D\to Q$ | 整合対 | [judge](judge.md) |
+| 12 | `na` | $\Leftrightarrow1$ | $D\to Q$ | 原型 $1$ との整合 | [judge](judge.md) |
+| 13 | `ni` | $\Leftrightarrow0$ | $D\to Q$ | 原型 $0$ との整合 | [judge](judge.md) |
+| 14 | `nu` | $\star_{\mathcal Q}$ | $Q\otimes Q\to Q$ | 非可換積 | [judge](judge.md) |
+| 15 | `ne` | $\varphi_\partial\circ\pi$ | $Q\to B$ | 所属 | [judge](judge.md) |
+| 16 | `no` | $\oplus$ | $D\otimes D\to D$ | 加算 | [dyad](dyad.md) |
+| 17 | `ha` | $\ominus$ | $D\to D$ | 負化 | [dyad](dyad.md) |
+| 18 | `hi` | $\le$ | $D\otimes D\to B$ | 大小 | [dyad](dyad.md) |
+| 19 | `hu` | $\mathsf{one}$ | $I\to D$ | 原点に立つ | [dyad](dyad.md) |
+| 20 | `he` | $\Delta$ | $D\to D\otimes D$ | 複製 | [dyad](dyad.md) |
+| 21 | `ho` | $!$ | $D\to I$ | 廃棄 | [dyad](dyad.md) |
+| 22 | `ma` | $\mathsf{node}$ | $I\to N$ | 原点ノード $\hat O$ | [noun](noun.md) |
+| 23 | `mi` | $\mathrm{Load}$ | $D\to D$ | 作業領域から読む | [machine](machine.md) |
+| 24 | `mu` | $\mathrm{Store}$ | $D\otimes D\to I$ | 作業領域へ書く | [machine](machine.md) |
+| 25 | `me` | $\mathrm{Ok}$ | $I\to I$ | 成功報告 | [machine](machine.md) |
+| 26 | `mo` | $\pi$ | $B\to D$ | 型忘却 | [dyad](dyad.md) |
+| 27 | `ya` | $\Omega$ 開き | $I\to I$ | 閉包の開き | [machine](machine.md) |
+| 28 | `yi` | $\Omega$ 閉じ | $B\to I$ | 閉包の閉じ | [machine](machine.md) |
+| 29 | `yu` | $\bigvee$ | $Q\otimes Q\to Q$ | 上限 | [judge](judge.md) |
+| 30 | `ye` | $\searrow$ | $Q\otimes Q\to Q$ | 右残差 | [judge](judge.md) |
+| 31 | `yo` | $\swarrow$ | $Q\otimes Q\to Q$ | 左残差 | [judge](judge.md) |
+| 32 | `ra` | $\le_{\mathcal Q}$ | $Q\otimes Q\to B$ | 判定値の大小 | [judge](judge.md) |
+| 33 | `ri` | $\hom$ | $N\otimes N\to Q$ | 到達度 | [noun](noun.md) |
+| 34 | `ru` | $\pi_{\mathcal Q}$ | $Q\to Q$ | 語の忘却 | [judge](judge.md) |
+| 35 | `re` | $\mathsf{trace}$ | $I\to T$ | 構成履歴 $O$ に立つ | [plane](plane.md) |
+| 36 | `ro` | $\rho^-$ | $T\to T$ | 境界射 $H^+\to H^-$ | [plane](plane.md) |
+| 37 | `wa` | $\rho^+$ | $T\to T$ | 境界射 $H^-\to H^+$ | [plane](plane.md) |
+| 38 | `wi` | $\operatorname{endpoint}$ | $T\to P$ | 履歴の終点 | [plane](plane.md) |
+| 39 | `wu` | $E$ | $I\to R$ | 折返し 恒等 | [plane](plane.md) |
+| 40 | `we` | $R_r$ | $I\to R$ | 実軸反転 | [plane](plane.md) |
+| 41 | `wo` | $R_{ij}$ | $I\to R$ | $ij$ 対角反転 | [plane](plane.md) |
+| 42 | `ga` | 折返しの合成 | $R\otimes R\to R$ | $D_4$ の積 | [plane](plane.md) |
+| 43 | `gi` | $\operatorname{act}$ | $R\otimes P\to P$ | 折返しの作用 | [plane](plane.md) |
+| 44 | `gu` | $\beta^{-1}$ | $D\to D$ | 逆二分割 $2x-1$ | [dyad](dyad.md) |
+| 45 | `ge` | $\mathsf{fix}$ | $D\to D$ | 集積点 | [dyad](dyad.md) |
+| 46 | `go` | $\Theta$ | $Q\to B$ | 二値化 | [judge](judge.md) |
+| 47 | `za` | $\beta_a$ | $D\otimes D\to D$ | 基準点つき二分割 | [dyad](dyad.md) |
+| 48 | `zi` | $\Omega_a[\beta_a;x_0]$ | $D\otimes D\to D$ | 基準点つき集積点 | [dyad](dyad.md) |
+| 49 | `zu` | $\rho_i$ | $N\to N$ | ノードへ $i$ | [noun](noun.md) |
+| 50 | `ze` | $\rho_j$ | $N\to N$ | ノードへ $j$ | [noun](noun.md) |
+| 51 | `zo` | $T_i$ | $N\otimes N\to N\otimes N$ | 関係述語 $i$ | [noun](noun.md) |
+| 52 | `da` | $T_j$ | $N\otimes N\to N\otimes N$ | 関係述語 $j$ | [noun](noun.md) |
+| 53 | `di` | $\mathrm{Ko}$ | $I\to I$ | 失敗報告 | [machine](machine.md) |
+| 54 | `du` | $\mathrm{Put}$ | $D\to I$ | 一 byte 出力 | [machine](machine.md) |
+| 55 | `de` | 実成分 | $P\to P$ | $(r,\omega)\mapsto(r,0)$ | [plane](plane.md) |
+| 56 | `do` | 無限成分 | $P\to P$ | $(r,\omega)\mapsto(\omega,0)$ | [plane](plane.md) |
+| 57 | `ba` | $\oslash$ | $D\otimes D\to Q_r$ | 除算 | [dyad](dyad.md) |
+| 58 | `bi` | $\partial$ | $C\to C$ | 鎖の境界 | [region](region.md) |
+| 59 | `bu` | $\oplus_{\mathsf{Chain}}$ | $C\otimes C\to C$ | 鎖の加算 | [region](region.md) |
+| 60 | `kukeke` | 領域 | $N\to G$ | 単位領域 | [region](region.md) |
+| 61 | `kukeko` | 共通部 | $G\otimes G\to G$ | $A\cap B$ | [region](region.md) |
+| 62 | `kukesa` | 合わせ | $G\otimes G\to G$ | $A\cup B$ | [region](region.md) |
+| 63 | `kukesi` | 外側 | $G\otimes G\to G$ | $U\setminus A$ | [region](region.md) |
+| 64 | `kukesu` | 境界 $\partial$ | $G\to C$ | 領域の境界 | [region](region.md) |
+| 65 | `kukese` | 含まれる | $G\otimes G\to B$ | $A\supseteq B$ | [region](region.md) |
+| 66 | `kukeso` | 重なり | $G\otimes G\to B$ | $A\cap B\neq\varnothing$ | [region](region.md) |
+| 67 | `kuketa` | 隣接 | $G\otimes G\to B$ | 境界を共有する | [region](region.md) |
+| 68 | `kuketi` | 道 | $G\to B$ | 一続きの領域か | [region](region.md) |
+
+## 音節から引く
+
+```
+ka  層境界      ki  無声ワイヤ    ku  三音節の名前の頭
+ke  id          ko  id_coord      sa  i             si  j          su  ⊖_trace
+se  β           so  φ∂            ta  ⊕_coord       ti  ⋆          tu  Δ_noun
+te  !_noun      to  ⇔             na  ⇔1            ni  ⇔0         nu  ⋆_Q
+ne  φ∂∘π        no  ⊕             ha  ⊖             hi  ≤          hu  one
+he  Δ           ho  !             ma  node          mi  Load       mu  Store
+me  Ok          mo  π             ya  Ω開き         yi  Ω閉じ      yu  ⋁
+ye  ↘           yo  ↙             ra  ≤_Q           ri  hom        ru  π_Q
+re  trace       ro  ρ⁻            wa  ρ⁺            wi  endpoint   wu  E
+we  R_r         wo  R_ij          ga  合成          gi  act        gu  β⁻¹
+ge  fix         go  Θ             za  β_a           zi  Ω_a        zu  ρ_i
+ze  ρ_j         zo  T_i           da  T_j           di  Ko         du  Put
+de  実成分      do  無限成分      ba  ⊘             bi  ∂_chain    bu  ⊕_chain
+
+kukeke 領域    kukeko 共通部   kukesa 合わせ   kukesi 外側    kukesu 境界
+kukese 含まれる kukeso 重なり  kuketa 隣接     kuketi 道
+```
+
+## 用例
+
+`continuous_republic/examples/` に、生成元ごとの最小の一本が置いてある。
+
+| ディレクトリ | 中身 |
+|---|---|
+| `cmn/` | 数と圏論層の入口 |
+| `vocabulary/` | 生成元ひとつを見せる最小の平文 |
+| `intent/` | 04 §17 の「計算すべき問い」 |
+| `region/` | 幾何 Level 0 の操作と関係 |
+| `edu/user/` | 採用語彙を使った学習用 |
Index: trunk/assets/cmn_lang_ref/generators/dyad.md
===================================================================
trunk/assets/cmn_lang_ref/generators/dyad.md
new file mode 100644
--- a/trunk/assets/cmn_lang_ref/generators/dyad.md	(nonexistent)
+++ b/trunk/assets/cmn_lang_ref/generators/dyad.md	(revision 2)
@@ -0,0 +1,210 @@
+# 二進有理数の層
+
+[← 総表](Index.md)
+
+$$
+\mathsf{Dyad}=\mathbb Z\!\left[\tfrac12\right],
+\qquad
+\text{値}=\frac{x}{2^{\delta}}
+$$
+
+語には分子 $x$ だけが載る。深度 $\delta$ は build 時の型なので、走らせる側には現れない。
+
+---
+
+## 入口
+
+### `hu` — $\mathsf{one}$ &nbsp;&nbsp; $I\to\mathsf{Dyad}$
+
+$$
+\llbracket\mathsf{one}\rrbracket=\langle1,0\rangle
+\tag{16.3.1}
+$$
+
+幾何の読みは「原点 $O$ に立つ」になる。数の literal はこの一語だけであり、
+残りは全部合成で作る。
+
+$$
+2=1\oplus1,\qquad
+0=1\oplus(\ominus1),\qquad
+\tfrac12=\beta(0),\qquad
+\tfrac34=\beta(\beta(0)),\qquad
+\tfrac14=\beta(\ominus\beta(0))
+\tag{16.5.5}
+$$
+
+---
+
+## 算術
+
+| 音節 | 記号 | 型 | 深度 |
+|---|---|---|---|
+| `no` | $\oplus$ | $D\otimes D\to D$ | $\max(\delta_u,\delta_v)$ へそろう |
+| `ha` | $\ominus$ | $D\to D$ | 変わらない |
+| `ti` | $\star$ | $D\otimes D\to D$ | $\delta_u+\delta_v$ |
+| `ba` | $\oslash$ | $D\otimes D\to\mathsf{Rational}$ | 分子と分母の二語 |
+
+加算は平行四辺形則であり、経路を忘れる。乗算はタレス比であり、経路を保持する。
+この非対称が体系の土台になる(幾何 3 章)。
+
+```
+hu hu ka
+no ka
+```
+
+値 $2$。`examples/cmn/futatsu.cmn`
+
+除算は二進比へ閉じないので、出口の型が $\mathsf{Rational}$ になる。
+零で割ると実行時に失敗を報告する。
+
+```
+hu hu ka ki se ka ba
+```
+
+分子 $2$、分母 $2$。`examples/vocabulary/ba_div.cmn`
+
+---
+
+## 二分割
+
+### `se` — $\beta$ &nbsp;&nbsp; $D\to D$
+
+$$
+\beta(x)=\frac{x+1}{2},
+\qquad
+\beta(1)=1
+\tag{16.5.4}
+$$
+
+基準点が $1$ であり、$1$ は不動点になる。だから半分は零から立てる。
+降下は四箱へ開く。
+
+$$
+\operatorname{Desc}(\beta)(u)=\bigl[\mathrm{Cst}(1,0),\ \mathrm{Add}(u,\cdot),\ \mathrm{Cst}(1,1),\ \mathrm{Mul}(\cdot,\cdot)\bigr]
+\tag{16.5.6}
+$$
+
+```
+hu hu ka, ki ha ka, no ka, se ka, se ka.
+```
+
+値 $3/2^2$。`examples/cmn/yonbunnosan.cmn`
+
+### `gu` — $\beta^{-1}$ &nbsp;&nbsp; $D\to D$
+
+$$
+\beta^{-1}(x)=2x-1
+$$
+
+像は深度 $1$ 以上に限る(構成語 §4 の $\operatorname{im}\beta_a$)。深度 $0$ の入力は失敗になる。
+
+### `za` — $\beta_a$ &nbsp;&nbsp; $D\otimes D\to D$
+
+$$
+\beta_a(x)=\frac{x+a}{2}
+\tag{22.9}
+$$
+
+基準点をワイヤで受ける形になる。16 式 (5.6) の $\mathrm{Cst}(1,0)$ が第二ワイヤに変わる。
+
+```
+hu hu ka
+za ka
+```
+
+値 $2/2^1$。`examples/vocabulary/za_bisect.cmn`
+
+---
+
+## 不動点
+
+### `ge` — $\mathsf{fix}$ &nbsp;&nbsp; $D\to D$
+
+$$
+x=\frac{x+1}{2}
+\ \Longrightarrow\
+x=1,
+\qquad
+\operatorname{Desc}(\mathsf{fix})(x_0)=\bigl[\mathrm{Cst}(1,0)\bigr]
+\tag{16.5.8}
+$$
+
+集積点は初期値に依らないので、入力ワイヤは落ちる。
+
+### `zi` — $\Omega_a[\beta_a;x_0]$ &nbsp;&nbsp; $D\otimes D\to D$
+
+$$
+\Omega_a[\beta_a;x_0]=a
+\tag{22.10}
+$$
+
+箱を作らず、第二ワイヤをそのまま返す。反復を回す箱は生成元レジストリに無い。
+
+```
+hu ka ge
+```
+
+値 $1$。`examples/vocabulary/ge_fix.cmn`
+
+---
+
+## 観測と二値
+
+| 音節 | 記号 | 型 | 値 |
+|---|---|---|---|
+| `so` | $\varphi_\partial$ | $D\to B$ | $[\,0<x\,]$ |
+| `hi` | $\le$ | $D\otimes D\to B$ | $[\,u\le v\,]$ |
+| `mo` | $\pi$ | $B\to D$ | 型を忘れる |
+
+どちらも 16 §5.3 の八箱へ降りる。$\mathcal M$ は値の join を memory しか持たないので、
+既定値を退避語へ置き、path separation の片側で書き換えてから読み戻す。
+
+$$
+\operatorname{Desc}(\text{判定})=
+\left[
+\begin{aligned}
+&n{+}0:\ \mathrm{Cst}(0,0)\\
+&n{+}1:\ \mathrm{Cst}(s,0)\\
+&n{+}2:\ \mathrm{Cst}(\mathrm d,0)\\
+&n{+}3:\ \mathrm{Store}(n{+}1,\ n{+}2)\\
+&n{+}4:\ \mathrm{LtBr}(A,\ B,\ n{+}7)\\
+&n{+}5:\ \mathrm{Cst}(1-\mathrm d,0)\\
+&n{+}6:\ \mathrm{Store}(n{+}1,\ n{+}5)\\
+&n{+}7:\ \mathrm{Load}(n{+}1)
+\end{aligned}
+\right]
+\tag{16.5.9}
+$$
+
+$\pi$ が型を忘れると、選択が生成元の合成で書ける。
+
+$$
+\operatorname{sel}(c,a,b)=c\star a\ \oplus\ (1\ominus c)\star b,
+\qquad
+c\in\{0,1\}
+\tag{16.5.11}
+$$
+
+分岐命令は要らない。
+
+```
+hu ka so ka mo ka
+```
+
+値 $1$。`examples/vocabulary/mo_pi.cmn`
+
+---
+
+## 複製と廃棄
+
+| 音節 | 記号 | 型 | 降下 |
+|---|---|---|---|
+| `he` | $\Delta$ | $D\to D\otimes D$ | 空列。同じワイヤを二度使う |
+| `ho` | $!$ | $D\to I$ | 空列。ワイヤを落とす |
+
+$!$ は境界を $I$ へ閉じる道になる。注記はこれで閉じる([language/01_source](../language/01_source.md) §3)。
+
+## 参照
+
+- [judge](judge.md) 判定値 $\mathcal Q$
+- [machine](machine.md) 作業領域と報告
Index: trunk/assets/cmn_lang_ref/generators/judge.md
===================================================================
trunk/assets/cmn_lang_ref/generators/judge.md
new file mode 100644
--- a/trunk/assets/cmn_lang_ref/generators/judge.md	(nonexistent)
+++ b/trunk/assets/cmn_lang_ref/generators/judge.md	(revision 2)
@@ -0,0 +1,144 @@
+# 判定値の層
+
+[← 総表](Index.md)
+
+$\mathcal Q$ は大きさと構成語の対になる。大きさは $[0,1]$ の有理数、構成語は $D_\infty$ の元である。
+
+$$
+q=\bigl(\ \text{大きさ}\ a/b,\ \ \text{語}\ w,\ \ \text{符号}\ s\ \bigr)
+$$
+
+出口では五語へ開く:$a$、$b$、$m$、$\varepsilon$、$s$。
+
+**定理 3.3** $\mathcal Q$ は非可換 quantale をなす。
+
+$$
+a\star b\le c
+\iff
+b\le a\searrow c
+\iff
+a\le c\swarrow b
+\tag{3.3}
+$$
+
+---
+
+## 整合対
+
+07 §6.2 が到達度から整合対を作る。
+
+$$
+\operatorname{ar}(a,c)=
+\begin{cases}
+1 & a=c=0\\
+0 & a=0\neq c\\
+\min(1,\ c\oslash a) & \text{その他}
+\end{cases}
+\qquad
+(q\Leftrightarrow p)=\operatorname{ar}(q,p)\star\operatorname{ar}(p,q)
+$$
+
+| 音節 | 記号 | 型 |
+|---|---|---|
+| `to` | $q\Leftrightarrow p$ | $D\otimes D\to Q$ |
+| `na` | $q\Leftrightarrow1$ | $D\to Q$ |
+| `ni` | $q\Leftrightarrow0$ | $D\to Q$ |
+
+```
+hu hu ka ki se ka to
+```
+
+$1\Leftrightarrow\beta(1)=1\Leftrightarrow1$。大きさ $4/4=1$。`examples/vocabulary/to_agree.cmn`
+
+`na` と `ni` は原型を書かずに済む形になる。分類器も特徴選択も現れない。
+
+---
+
+## 積と上限
+
+| 音節 | 記号 | 型 | 性質 |
+|---|---|---|---|
+| `nu` | $\star$ | $Q\otimes Q\to Q$ | 非可換。語を接合する |
+| `yu` | $\bigvee$ | $Q\otimes Q\to Q$ | 完備束の上限。結合的かつ可換 |
+| `ra` | $\le$ | $Q\otimes Q\to B$ | 大きさの交差乗算で取る |
+
+$\bigvee$ が結合的かつ可換なので、候補を畳む順序が値を変えない。
+だから探索順が本文に現れない([language/03_intent](../language/03_intent.md) §3)。
+
+```
+hu hu ka na na ka nu
+```
+
+`examples/vocabulary/nu_star.cmn`
+
+---
+
+## 残差
+
+$$
+q\searrow c=\max\bigl\{\,r\ \bigm|\ q\star r\le c\,\bigr\},
+\qquad
+c\swarrow q=\max\bigl\{\,r\ \bigm|\ r\star q\le c\,\bigr\}
+$$
+
+| 音節 | 記号 | 左に立つ入力 |
+|---|---|---|
+| `ye` | $\searrow$ | 第一 |
+| `yo` | $\swarrow$ | 第二 |
+
+残差は随伴なので、$\max$ の中身を探す手続きが要らない。
+
+```
+hu hu ka ki se ka na na ka yo
+```
+
+`examples/vocabulary/yo_resl.cmn`
+
+---
+
+## 忘却と二値化
+
+| 音節 | 記号 | 型 | 何を落とすか |
+|---|---|---|---|
+| `ru` | $\pi_{\mathcal Q}$ | $Q\to Q$ | 構成語。大きさは動かない |
+| `go` | $\Theta$ | $Q\to B$ | 大きさの正値だけ読む |
+| `ne` | $\varphi_\partial\circ\pi$ | $Q\to B$ | 所属。閾値は現れない |
+
+07 §6.3 の所属は二段の忘却になる。
+
+$$
+x\models m
+\iff
+\varphi_\partial\bigl(\pi(C_m(x))\bigr)=1,
+\qquad
+C_m(x)=\mathop{\bigstar}_{\ell\in L}\bigl(w(\ell,x)\Leftrightarrow p_\ell\bigr)
+$$
+
+目印ごとの整合対を $\star$ で畳み、境界で二値にする。閾値を書く席が構文に無い。
+
+```
+hu ka na ka go
+```
+
+値 $1$。`examples/vocabulary/go_theta.cmn`
+
+---
+
+## 到達度
+
+### `ri` — $\hom$ &nbsp;&nbsp; $N\otimes N\to Q$
+
+二つの名詞ノードの影響プロファイルを目印ごとに比べ、右残差を $\bigvee$ で畳む。
+
+```
+ma ma ka
+ri ka
+```
+
+`examples/vocabulary/ri_hom.cmn`
+
+## 参照
+
+- [dyad](dyad.md) 二進有理数
+- [noun](noun.md) 名詞ノードと影響
+- [language/03_intent](../language/03_intent.md) 意図の判定条件
Index: trunk/assets/cmn_lang_ref/generators/machine.md
===================================================================
trunk/assets/cmn_lang_ref/generators/machine.md
new file mode 100644
--- a/trunk/assets/cmn_lang_ref/generators/machine.md	(nonexistent)
+++ b/trunk/assets/cmn_lang_ref/generators/machine.md	(revision 2)
@@ -0,0 +1,121 @@
+# 作業領域と外部環境
+
+[← 総表](Index.md)
+
+意味レジストリ $\mathcal M$ の原子はそのまま降りる(16 §5.0)。正準添字を取らないので、
+平文の側から届く。
+
+$$
+\operatorname{ord}(g)\in[0,11]\ \Longrightarrow\ \mathcal M\ \text{と一致},
+\qquad
+\text{だから降下は名前を変えない}
+$$
+
+---
+
+## 作業領域
+
+| 音節 | 記号 | 型 | 意味 |
+|---|---|---|---|
+| `mi` | $\mathrm{Load}$ | $D\to D$ | 語番号から読む |
+| `mu` | $\mathrm{Store}$ | $D\otimes D\to I$ | 語番号へ書く |
+
+番地も値もワイヤで来るので、正準添字が要らない。語の byte 幅は architecture package が
+持つので source に現れない(§32.2)。
+
+$\mathrm{Load}$ は深度を落とす唯一の箱になる。語には分子だけが載るためである。
+
+### 退避語
+
+二値の八箱は既定値を語へ退避する(16 §5.3)。退避語は本文の語の上へ置く。
+
+$$
+S=1+\max\Bigl(31,\ |\Gamma^+|-1,\ \bigl\{\text{定数から畳める Load / Store の番地}\bigr\}\Bigr)
+$$
+
+一段目の降下は $S$ を決めるためだけに走る。退避語は本文の番地へ流れないので、
+二段目の番地は一段目と同じになる。
+
+---
+
+## 外部環境への報告
+
+| 音節 | 記号 | 型 | 実行 |
+|---|---|---|---|
+| `me` | $\mathrm{Ok}$ | $I\to I$ | 成功報告。実行を閉じる |
+| `di` | $\mathrm{Ko}$ | $I\to I$ | 失敗報告。実行を閉じる |
+| `du` | $\mathrm{Put}$ | $D\to I$ | 一 byte 出力。実行を閉じない |
+
+$\mathrm{Put}$ は $[0,255]$ の整数として読み、範囲外は下位 8 bit を採る。
+
+```
+hu ka du ka me
+```
+
+`examples/vocabulary/du_put.cmn`。境界が $I$ なので出力語を持たない。
+
+$\varphi_\partial$ は原子に入らない。唯一の非可逆観測は path separation と外部報告の対で現れる。
+$\mathrm{EqBr}$ / $\mathrm{LtBr}$ が連続量を二つの経路へ分け、$\mathrm{Ok}$ / $\mathrm{Ko}$ が
+その結果を境界の外へ出す。この二段が $\varphi_\partial$ の実現形になる。
+
+---
+
+## 閉包
+
+| 音節 | 記号 | 型 |
+|---|---|---|
+| `ya` | $\Omega$ の開き | $I\to I$ |
+| `yi` | $\Omega$ の閉じ | $B\to I$ |
+
+開きの層で本体の先頭箱番号と frontier を控え、閉じの層で単調フラグを一本受けて
+後退分岐を置く。フラグが $0$ の間は本体へ戻る。
+
+$$
+F:X\otimes A\to A,
+\qquad
+\Omega_a[F]:X\to A
+\tag{構成語 5.4}
+$$
+
+$$
+h_n\le h_{n+1},
+\qquad
+\bigvee_n h_n=1\ \text{で境界へ集積}
+\tag{構成語 5.5}
+$$
+
+有限高さの単調反復は有限段で不動点になる(04 定理 9.1)。
+
+状態は作業領域が持つ。frontier は開きと閉じで同じでなければならないので、
+繰り返しの間に持ち越す値はワイヤに載らない。
+
+```
+hu ka ya ka hu ka so ka yi
+```
+
+値 $1$。`examples/vocabulary/yi_omega.cmn`
+
+---
+
+## 平文へ届かない四つ
+
+$\mathrm{Cst}$、$\mathrm{EqBr}$、$\mathrm{LtBr}$、$\mathrm{Br}$ は正準添字を取る。
+平文に数字も label も現れないので(16 §3.1)、この四つは番号の席を占めるだけになる。
+
+代わりに置く道は次のとおり。
+
+| 要るもの | 平文での書き方 |
+|---|---|
+| 定数 | $\mathsf{one}$(`hu`)と算術の合成 |
+| 条件分岐 | $\operatorname{sel}(c,a,b)=c\star a\oplus(1\ominus c)\star b$ |
+| 後退分岐 | `ya` と `yi` の対 |
+
+$$
+\text{分岐命令は要らない。平文の側に literal も label も現れない}
+\tag{16.5.11}
+$$
+
+## 参照
+
+- [dyad](dyad.md) 二値を作る八箱
+- [toolchain/01_build](../toolchain/01_build.md) 走らせ方
Index: trunk/assets/cmn_lang_ref/generators/noun.md
===================================================================
trunk/assets/cmn_lang_ref/generators/noun.md
new file mode 100644
--- a/trunk/assets/cmn_lang_ref/generators/noun.md	(nonexistent)
+++ b/trunk/assets/cmn_lang_ref/generators/noun.md	(revision 2)
@@ -0,0 +1,122 @@
+# 名詞の層
+
+[← 総表](Index.md)
+
+名詞ノードは原点から関係語で到達する点になる。個体ごとの literal は要らない。
+
+$$
+\mathsf{node}:\ I\to\mathsf{Noun},
+\qquad
+\llbracket\mathsf{node}\rrbracket=\hat O
+\tag{16.3.2}
+$$
+
+$\hat O=\mathrm{QCoeff}\ 1\ 0\ [\,]\ 1$ が原点になる。
+
+---
+
+## 入口と関係
+
+| 音節 | 記号 | 型 | 意味 |
+|---|---|---|---|
+| `ma` | $\mathsf{node}$ | $I\to N$ | 原点ノード $\hat O$ |
+| `zu` | $\rho_i$ | $N\to N$ | ノードへ $i$ を当てる |
+| `ze` | $\rho_j$ | $N\to N$ | ノードへ $j$ を当てる |
+| `zo` | $T_i$ | $N\otimes N\to N\otimes N$ | 関係述語 $i$。主語へ語を当て、目的語を素通しにする |
+| `da` | $T_j$ | $N\otimes N\to N\otimes N$ | 関係述語 $j$ |
+| `te` | $!_{\mathsf{Noun}}$ | $N\to I$ | 廃棄 |
+| `ri` | $\hom$ | $N\otimes N\to Q$ | 到達度 |
+
+出口は五語になる:位置の四語(大きさ $n$、深度 $d$ を畳んだ値、語の $m$、$\varepsilon$、符号)と目印の数。
+
+---
+
+## 非可換性が値になる
+
+構成語は $D_\infty=\langle i,j\mid i^2=j^2=e\rangle$ の元であり、$(m,\varepsilon)$ の対で尽きる。
+
+$$
+i=(0,1),
+\qquad
+j=(1,1),
+\qquad
+(m,\varepsilon)\cdot(m',\varepsilon')=\bigl(m+(1-2\varepsilon)m',\ \varepsilon+\varepsilon'-2\varepsilon\varepsilon'\bigr)
+$$
+
+```
+ma ka zu ka ze      →  1 -1  0  1  0        ij  の位置は m = −1
+ma ka ze ka zu      →  1  1  0  1  0        ji  の位置は m = +1
+```
+
+$ij\neq ji$ が語の値として見える。07 例5.1 が要求する
+
+$$
+T_{j\circ i}:O\mapsto ij,
+\qquad
+T_{i\circ j}:O\mapsto ji,
+\qquad
+T_f\star T_g\neq T_g\star T_f
+$$
+
+がこの二本で確かめられる。`examples/vocabulary/noun_ij.cmn`、`noun_ji.cmn`
+
+$\mathsf{Dyad}$ の $\star$ は可換なので、この差は $\mathsf{Dyad}$ では表せない(17 §2)。
+
+---
+
+## 複製の禁止
+
+`tu`($\Delta_{\mathsf{Noun}}$)は平文に置けない。13 §1.2 が $\mathsf{Noun}$ を $\mu=\infty$ で複製不可と定め、
+平文は $\mu=\infty$ だからである(16 §1.1)。
+
+```
+ma ka
+tu ka
+```
+
+両方の compiler が image を出さずに止まる。`examples/vocabulary/tu_no_copy.cmn`
+
+廃棄 `te` に同じ制限は無い。
+
+---
+
+## SOV の文
+
+02 (9.1) の層構造を、名詞ワイヤの位置で組む(17 §4.3)。
+
+$$
+\Lambda_0=C_S\otimes C_O\otimes C_E,
+\quad
+\Lambda_1=T_{w_S}\,@\,0,
+\quad
+\Lambda_2=T_{w_O}\,@\,1,
+\quad
+\Lambda_3=T_{w_V}\,@\,0,
+\quad
+\Lambda_4={!}^{\otimes3}
+$$
+
+$C_E$ は文末ノードになる。二項の $T$ は位置 $q$ と $q+1$ を読むので、
+末尾に一本余分なワイヤがあれば目的語側にも関係語を当てられる。文末の廃棄が $\Gamma^+=I$ を閉じる。
+
+---
+
+## 影響プロファイル
+
+名詞の同一性は、共通の目印族 $L$ で測ったプロファイルの一致で与える(07 §10)。
+
+$$
+\hat x=\bigl(w(\ell_0,x),\ \ldots,\ w(\ell_n,x)\bigr),
+\qquad
+\sum_{\ell\in L}w(\ell,x)=1
+$$
+
+重心拘束は凸性から出る(影響関数 証明3.1)。ネットワークは一つであり、概念はその上の測定装置になる。
+
+プロファイルを平文から立てる生成元は無い。正準添字を取るので `.cml` の側になる
+
+## 参照
+
+- [plane](plane.md) ツイ数平面
+- [region](region.md) ノードの位置が単位領域を決める
+- [judge](judge.md) 到達度と整合対
Index: trunk/assets/cmn_lang_ref/generators/plane.md
===================================================================
trunk/assets/cmn_lang_ref/generators/plane.md
new file mode 100644
--- a/trunk/assets/cmn_lang_ref/generators/plane.md	(nonexistent)
+++ b/trunk/assets/cmn_lang_ref/generators/plane.md	(revision 2)
@@ -0,0 +1,130 @@
+# ツイ数平面の層
+
+[← 総表](Index.md)
+
+ツイ数平面は連続な $\mathbb R^2$ ではない。操作の DAG が生む点の網と、それを支える領域の組になる。
+
+$$
+\text{ツイ数平面}
+=\Pi_i\ \sqcup_{\ \mathbb R\text{-軸}}\ \Pi_j
+$$
+
+$\Pi_i$ は $\omega$ の非対称性を参照して出る半平面、$\Pi_j$ は $\omega^-$ の側になる。
+両者は実軸でだけ接続する。
+
+$$
+i^2=-1,
+\qquad
+j^2=+1\ \ (j\neq1,\ j\neq-1)
+$$
+
+座標的に $(1,1)$ と書ける位置は、和ではなく「$O$ に操作 $ij$ を当てて到達した端点」になる。
+
+---
+
+## 履歴 $\mathsf{Trace}$
+
+構成履歴は $\sigma^\varepsilon a$ の形で持つ。複製できない(構成語 §3.5)。
+
+| 音節 | 記号 | 型 | 意味 |
+|---|---|---|---|
+| `re` | $\mathsf{trace}$ | $I\to T$ | 原点 $O$ に立つ |
+| `sa` | $i$ | $T\to T$ | 構成生成元 $i$ を当てる |
+| `si` | $j$ | $T\to T$ | 構成生成元 $j$ を当てる |
+| `ke` | $\mathrm{id}$ | $T\to T$ | 恒等道。値も箱も動かない |
+| `su` | $\ominus$ | $T\to T$ | 履歴の負化 |
+| `ro` | $\rho^-$ | $T\to T$ | 境界射 $H^+\to H^-$ |
+| `wa` | $\rho^+$ | $T\to T$ | 境界射 $H^-\to H^+$ |
+
+出口は四語になる:$m$、$\varepsilon$、spot、符号。
+
+```
+re ka ke ka        →  0  0  1  1        恒等道は履歴を動かさない
+re ka ro ka        →  0  0 -1 -1        ρ⁻ は spot と符号を反転する
+re ka wa ka        →  0  0  1  1        j² = +1 なので ρ⁺ は値を動かさない
+re ka su           →  0  0 -1 -1        履歴の負化は ρ⁻ と同じ式になる
+```
+
+`examples/vocabulary/` の `ke_id` `ro_rho_minus` `wa_rho_plus` `su_trace_neg`
+
+---
+
+## 点 $\mathsf{Point}$
+
+### `wi` — $\operatorname{endpoint}$ &nbsp;&nbsp; $T\to P$
+
+履歴の終点を座標へ落とす。正準点は構成語 §7.4 の並びになる。
+
+$$
+\mathcal A=\{O,\ \omega,\ \omega^-,\ i,\ j,\ p_{++},\ p_{-+},\ p_{+-},\ p_{--}\}
+$$
+
+| 音節 | 記号 | 型 | 意味 |
+|---|---|---|---|
+| `ko` | $\mathrm{id}_{\mathrm{coord}}$ | $P\to P$ | 座標の恒等道 |
+| `ta` | $\oplus_{\mathrm{coord}}$ | $P\otimes P\to P$ | 平行四辺形則。深い側へそろえる |
+| `de` | 実成分 | $P\to P$ | $(r,\omega)\mapsto(r,0)$ |
+| `do` | 無限成分 | $P\to P$ | $(r,\omega)\mapsto(\omega,0)$ |
+
+```
+re ka wi ka ko                       →  1  0
+re ka sa ka si ka wi ka de           →  1  0
+re ka wi ka re ki ka wi ki ka ta     →  2  0
+```
+
+---
+
+## 折返し $\mathsf{Reflection}$
+
+$D_4$ の八元を持つ。合成は符号つき置換の積になるので、表を写さずに済む。
+
+| 番号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+|---|---|---|---|---|---|---|---|---|
+| 折返し | $E$ | $R_r$ | $R_\omega$ | $R_{ij}$ | $R_{ji}$ | $Q_+$ | $Q_-$ | $C_\pi$ |
+
+| 音節 | 記号 | 型 |
+|---|---|---|
+| `wu` | $E$ | $I\to R$ |
+| `we` | $R_r$ | $I\to R$ |
+| `wo` | $R_{ij}$ | $I\to R$ |
+| `ga` | 合成 | $R\otimes R\to R$ |
+| `gi` | $\operatorname{act}$ | $R\otimes P\to P$ |
+
+$R$ が引数つきの一箱でなく四箱に分かれているのは、平文が正準添字を書けないためになる(16 §3.1)。
+§7.3 の生成関係が八元すべてを合成で出すので、表現力はそろう。
+
+```
+wu            →  0        恒等
+we wo ka ga   →  5        R_r · R_ij = Q_+
+```
+
+---
+
+## 五語でツイ数平面を歩く
+
+`examples/cmn/tsuisuu.cmn`
+
+```
+we re ka, ki sa ka, ki si ka, ki wi ka, gi ka.
+```
+
+| 層 | 音節 | 箱 | frontier |
+|---|---|---|---|
+| 0 | `we` `re` | $R_r$ を立てる、履歴 $O$ に立つ | $\mathsf{Reflection}\otimes\mathsf{Trace}$ |
+| 1 | `ki` `sa` | 素通し、$i$ | 同上 |
+| 2 | `ki` `si` | 素通し、$j$ | 同上 |
+| 3 | `ki` `wi` | 素通し、$\operatorname{endpoint}$ | $\mathsf{Reflection}\otimes\mathsf{Point}$ |
+| 4 | `gi` | $\operatorname{act}$ | $\mathsf{Point}$ |
+
+$i$ の後に $j$ を当てた履歴の終点は $ij=(+1,+1)=p_{++}$ になり、実軸反転がそれを $p_{+-}$ へ送る。
+
+$$
+\operatorname{act}\bigl(R_r,\ \operatorname{endpoint}(O\,i\,j)\bigr)=R_r(p_{++})=p_{+-}=(1,-1)
+$$
+
+出口は $1$ と $-1$ になる。
+
+## 参照
+
+- [noun](noun.md) 名詞ノード。構成語の非可換性が値になる層
+- [region](region.md) 領域。ノードの位置が cell 番号を決める
Index: trunk/assets/cmn_lang_ref/generators/region.md
===================================================================
trunk/assets/cmn_lang_ref/generators/region.md
new file mode 100644
--- a/trunk/assets/cmn_lang_ref/generators/region.md	(nonexistent)
+++ b/trunk/assets/cmn_lang_ref/generators/region.md	(revision 2)
@@ -0,0 +1,207 @@
+# 領域と鎖の層
+
+[← 総表](Index.md)
+
+Level 0 の原始概念は六つになる(幾何 Index)。
+
+> 領域・内側/外側・重なり・含まれる・隣接・道
+
+操作は四つで尽きる。
+
+| 操作 | 何をするか |
+|---|---|
+| 共通部 | 二つの領域が重なっている部分を取り出す |
+| 合わせ | 二つの領域を一つにまとめた最小の領域を作る |
+| 外側 | ある閉じた領域の外にある領域を取る |
+| 境界 $\partial$ | 内側と外側を分ける面を取り出す |
+
+関係はこの四つの上の述語になる。
+
+$$
+\begin{aligned}
+\text{重なり}(A,B)&\iff A\cap B\neq\varnothing\\
+\text{含まれる}(A,B)&\iff B\setminus A=\varnothing\\
+\text{隣接}(A,B)&\iff A\cap B=\varnothing\ \wedge\ \bigl((2A\cap B)\cup(A\cap2B)\bigr)\neq\varnothing\\
+\text{道}(A)&\iff A\neq\varnothing\ \wedge\ \text{立っている cell が一続き}
+\end{aligned}
+$$
+
+---
+
+## 単位領域はノードから立つ
+
+### `kukeke` — 領域 &nbsp;&nbsp; $N\to G$
+
+構成語は $D_\infty=\langle i,j\mid i^2=j^2=e\rangle$ の元であり、$(m,\varepsilon)$ の対で尽きる。
+
+$$
+\operatorname{cell}(w)=2\cdot\operatorname{zz}(m)+\varepsilon,
+\qquad
+\operatorname{zz}(m)=
+\begin{cases}
+2m & m\ge0\\
+-2m-1 & m<0
+\end{cases}
+$$
+
+$\operatorname{zz}$ は単射なので $\operatorname{cell}$ も単射になる。別のノードが同じ単位領域を指すことは無く、
+共通部と合わせが目印の重なりを正しく写す。
+
+| ノード | 平文 | $(m,\varepsilon)$ | cell |
+|---|---|---|---:|
+| $O$ | `ma` | $(0,0)$ | 0 |
+| $i$ | `ma ka zu` | $(0,1)$ | 1 |
+| $ij$ | `ma ka zu ka ze` | $(-1,0)$ | 2 |
+| $ji$ | `ma ka ze ka zu` | $(1,0)$ | 4 |
+| $j$ | `ma ka ze` | $(1,1)$ | 5 |
+
+cell は 31 個までになる。commonc が領域を一語の mask で持つためで、
+$O$ から 15 歩までの構成語がこの網に収まる。
+
+```
+ma ka
+kukeke ka
+```
+
+出力は cell の数 $1$ と cell 番号 $0$ になる。`examples/region/01_cell.cmn`
+
+---
+
+## 四操作
+
+| 音節 | 操作 | 型 | 例 |
+|---|---|---|---|
+| `kukeko` | 共通部 | $G\otimes G\to G$ | `examples/region/02_meet.cmn` |
+| `kukesa` | 合わせ | $G\otimes G\to G$ | `03_join.cmn` |
+| `kukesi` | 外側 | $G\otimes G\to G$ | `04_outside.cmn` |
+| `kukesu` | 境界 $\partial$ | $G\to C$ | `11_boundary.cmn` |
+
+外側は第一引数を宇宙、第二引数を抜く側に取る。
+
+$$
+\text{外側}(U,A)=U\setminus A
+$$
+
+```
+ma ma ma ka
+ki zu ki ka
+kukeke kukeke kukeke ka
+kukesa ki ka
+kukesi ka
+```
+
+$\{O,i\}\setminus\{O\}=\{i\}$。出力は $1$ と $1$ になる。
+
+---
+
+## 関係
+
+| 音節 | 関係 | 型 |
+|---|---|---|
+| `kukese` | 含まれる | $G\otimes G\to B$ |
+| `kukeso` | 重なり | $G\otimes G\to B$ |
+| `kuketa` | 隣接 | $G\otimes G\to B$ |
+| `kuketi` | 道 | $G\to B$ |
+
+値は compile 時に決まり、$\mathrm{Cst}$ 一箱で開いて実行時のワイヤになる。
+だから $\pi$(`mo`)を通せば算術へ流せる。
+
+```
+ma ma ka
+ki zu ka
+kukeke kukeke ka
+kuketa ka
+```
+
+$O$ の単位領域と $i$ の単位領域は cell 0 と 1 になり、隣り合う。値は $1$。
+`examples/region/07_adjacent.cmn`
+
+$j$ へ替えると cell は 0 と 5 になり、値は $0$ になる。`08_apart.cmn`
+
+走査も隣接リストも本文に現れない([language/03_intent](../language/03_intent.md) §6)。
+
+---
+
+## 鎖
+
+$n$-単体の境界は符号つきの和になる(影響関数 証明3.2)。
+
+$$
+\partial\sigma_n=\sum_{k=0}^{n}(-1)^k[v_0,\ldots,\hat v_k,\ldots,v_n]
+$$
+
+係数は $\{-1,0,1\}$ に限られる。$\sigma_{n-1}$ が $\sigma_n$ の境界に符号つきで入るか、
+入らないかの三択しかないためになる。
+
+領域の境界は cell の両端に立つ。
+
+$$
+\partial A\ \text{の係数}(v)=[\,v-1\in A\,]-[\,v\in A\,],
+\qquad
+\text{正側}=2A\setminus A,
+\quad
+\text{負側}=A\setminus2A
+$$
+
+$2A$ は mask の倍であり、左シフトが乗算そのものなので箱を作らずに済む。
+
+| 音節 | 記号 | 型 |
+|---|---|---|
+| `bi` | $\partial$ | $C\to C$ |
+| `bu` | $\oplus$ | $C\otimes C\to C$ |
+
+### 閉じた曲面に境界は無い
+
+```
+ma ka
+kukeke ka
+kukesu ka
+bi ka
+```
+
+出力は $0$、つまり項の無い鎖になる。
+
+$$
+\partial(\partial G)=\varnothing
+$$
+
+$\mathbb R^3$ の閉じた曲面は内側と外側を分ける面であり、その面には境界が無い。
+冪零性は代数の要請ではなく、この幾何的事実の係数表現になる。
+`examples/region/12_nilpotent.cmn`
+
+### 鎖の加算
+
+$|$係数$|$ が $2$ になる和は鎖でなくなるので、両方の compiler が失敗を報告する。
+
+```
+ma ma ka
+ki ze ka
+kukeke kukeke ka
+kukesu kukesu ka
+bu ka
+```
+
+$\partial\{O\}\oplus\partial\{j\}$ は頂点 $0,1,5,6$ に $\mp1$ を立てる。出力の先頭は $4$ になる。
+`examples/region/13_chainsum.cmn`
+
+同じ領域を二度足すと係数が $2$ になり、image が出ない。`16_chain_two.cmn`
+
+---
+
+## 出口の語
+
+| 型 | 開く語 |
+|---|---|
+| $\mathsf{Region}$ | cell の数、cell 番号(昇順) |
+| $\mathsf{Chain}$ | 頂点の数、各頂点の(係数、頂点数 $1$、頂点番号) |
+
+```
+ma ka / kukeke ka / kukesu ka       →  2  −1 1 0  1 1 1
+```
+
+$\partial\{O\}$ は頂点 $0$ に $-1$、頂点 $1$ に $+1$ を立てる。
+
+## 参照
+
+- [noun](noun.md) 名詞ノード。cell 番号の出どころ
+- [language/03_intent](../language/03_intent.md) 走査を書かずに済む問い
Index: trunk/assets/cmn_lang_ref/language/01_source.md
===================================================================
trunk/assets/cmn_lang_ref/language/01_source.md
new file mode 100644
--- a/trunk/assets/cmn_lang_ref/language/01_source.md	(nonexistent)
+++ b/trunk/assets/cmn_lang_ref/language/01_source.md	(revision 2)
@@ -0,0 +1,135 @@
+# 音節・層・frontier
+
+[← Index](../Index.md)
+
+## 1. 音節表
+
+音節は子音と母音の積で作る(06 §1)。
+
+$$
+P=\{\sigma(c,v)=cv\mid c\in C,\ v\in V\},
+\qquad
+|C|=14,\quad|V|=5,\quad|P|=70
+$$
+
+```
+        a    i    u    e    o
+  k     ka   ki   ku   ke   ko
+  s     sa   si   su   se   so
+  t     ta   ti   tu   te   to
+  n     na   ni   nu   ne   no
+  h     ha   hi   hu   he   ho
+  m     ma   mi   mu   me   mo
+  y     ya   yi   yu   ye   yo
+  r     ra   ri   ru   re   ro
+  w     wa   wi   wu   we   wo
+  g     ga   gi   gu   ge   go
+  z     za   zi   zu   ze   zo
+  d     da   di   du   de   do
+  b     ba   bi   bu   be   bo
+  p     pa   pi   pu   pe   po
+```
+
+先頭三つは予約されている。
+
+| 番号 | 音節 | 役目 |
+|---:|---|---|
+| 0 | `ka` | 層境界 |
+| 1 | `ki` | 無声ワイヤ(恒等箱ひとつ) |
+| 2 | `ku` | 零標示音 $z_e$。三音節の名前の頭にもなる |
+
+生成元 $k$ 番の名前は式 (1.2) が決める(10 §1)。
+
+$$
+\operatorname{name}(k)=
+\begin{cases}
+[\sigma_{3+k}] & k<60\\[4pt]
+\texttt{ku}\cdot[\sigma_{3+q},\ \sigma_{3+r}] & k\ge60,\quad k-60=60q+r
+\end{cases}
+\tag{1.2}
+$$
+
+$\sigma_{63}\ldots\sigma_{69}$(`be` `bo` `pa` `pi` `pu` `pe` `po`)は採用語彙の字母 $\Sigma_V$ になる。
+名前の頭に立つ `ku` はどの一音節名とも一致しないので、名前の集合は接頭自由になり、
+最長一致の語彙引きが一意に決まる。
+
+## 2. 層と frontier
+
+層境界音が層を切る。層の中では、箱が **今の位置から** 入力を取る。
+
+$$
+S(k,q,r)=a
+\tag{2.1}
+$$
+
+| テンソルの軸 | 音節列での現れ方 |
+|---|---|
+| $r$ 因果深度 | `ka` の出現回数 |
+| $q$ frontier 位置 | 層の中での音節の位置 |
+| $k$ 語位置 | 表示の都合。テンソルには現れない |
+
+層の高さは前駆関係から出る(構成語 §2.2)。
+
+$$
+h(v)=
+\begin{cases}
+0 & \operatorname{Pred}(v)=\varnothing\\
+1+\max_{u\in\operatorname{Pred}(v)}h(u) & \text{その他}
+\end{cases}
+\tag{2.2}
+$$
+
+定理 2.1 がこの分解を一意にする。だから読みは文法解析ではなく復号になる。
+
+### 例
+
+```
+hu hu hu ka        層 0   frontier = [D, D, D]
+ki no ka           層 1   位置 0 を素通し、位置 1〜2 を足す → [D, D]
+no ka              層 2   位置 0〜1 を足す               → [D]
+```
+
+`ki` は「この位置のワイヤを次の層へそのまま渡す」を表す。位置を一つ進める。
+
+## 3. 注記
+
+境界を $I$ で閉じた文は、境界流を動かさない(16 §4)。
+
+$$
+C:I\to I,
+\qquad
+C_1;C;C_2=C_1;C_2
+\quad(\text{境界の上で})
+\tag{3.1}
+$$
+
+値を立てて廃棄で閉じれば、どんな長さの文でもこの形になる。
+
+```
+hu hu ka, ki ha ka, no ka, se ka, se ka, ho ka.
+hu hu ka, no ka.
+```
+
+一文目は $3/4$ を立てて `ho`($!$)で捨てる。二文目の値 $2$ は変わらない。
+注記はテンソルに載り、$\operatorname{CNF}$ を持ち、$\#k$ で参照できる。
+
+$$
+\boxed{\ \text{コメントとコードの区別は構文に無い。境界の幅にしかない}\ }
+$$
+
+## 4. 表示の自由
+
+命題 11.1 により、語境界は可逆表示の範囲で自由に動く。次の三つは同じチェンバーを与える。
+
+```
+hu hu ka ki ha ka no ka se ka se ka
+huhuka, kihaka.
+  noka
+  seka seka!
+```
+
+## 参照
+
+- [02_boundary](02_boundary.md) 境界と型
+- [03_intent](03_intent.md) 意図の判定条件
+- [generators/Index](../generators/Index.md) 生成元の総表
Index: trunk/assets/cmn_lang_ref/language/02_boundary.md
===================================================================
trunk/assets/cmn_lang_ref/language/02_boundary.md
new file mode 100644
--- a/trunk/assets/cmn_lang_ref/language/02_boundary.md	(nonexistent)
+++ b/trunk/assets/cmn_lang_ref/language/02_boundary.md	(revision 2)
@@ -0,0 +1,100 @@
+# 境界と型
+
+[← Index](../Index.md)
+
+## 1. 境界は決まる
+
+チェンバーは境界と層列で書く(構成語 §2.3)。
+
+$$
+\operatorname{ser}(C)=\bigl\langle(\mu,d)\mid\Gamma^-\Rightarrow\Lambda_0;\cdots;\Lambda_h\Rightarrow\Gamma^+\bigr\rangle
+\tag{1.1}
+$$
+
+平文では五つの欄を書かない。
+
+| 欄 | 平文での扱い |
+|---|---|
+| $\mu$ | 全体で $\infty$ |
+| $d$ | 本体から出る。$d(f;g)=d(f)+d(g)$ |
+| $\Gamma^-$ | $I$。文章は何も受け取らずに始まる |
+| $\Gamma^+$ | 層を順に当てれば決まる(定理 2.2) |
+| $\operatorname{addr}$ | $\Omega$ の箱が自分の集積点を持つ |
+
+$\Gamma^-=I$ なので、層 0 に置けるのは $\operatorname{pin}=0$ の箱だけになる。
+
+$$
+\{\,g\mid\operatorname{pin}(g)=0\,\}
+=\{\ \texttt{hu},\ \texttt{ma},\ \texttt{re},\ \texttt{wu},\ \texttt{we},\ \texttt{wo},\ \texttt{me},\ \texttt{di},\ \texttt{ya}\ \}
+$$
+
+この九つが文章の入口になる。それぞれ二進有理数・名詞・履歴・折返し・報告・閉包の開きを立てる。
+
+## 2. 型レジストリ
+
+| 番号 | 型 | 内容 | 複製 |
+|---:|---|---|---|
+| 0 | $\mathsf{Point}$ | 座標点 $(r,\omega)$ | 可 |
+| 1 | $\mathsf{Trace}$ | 構成履歴 $\sigma^\varepsilon a$ | 不可 |
+| 2 | $\mathsf{Reflection}$ | $D_4$ の八元 | 可 |
+| 3 | $\mathsf{Dyad}$ | 二進有理数 $x/2^\delta$ | 可 |
+| 4 | $\mathsf{Bit}$ | 二値 | 可 |
+| 5 | $\mathcal Q$ | 影響値 | 不可 |
+| 6 | $\mathsf{Mono}$ | 単項式番号 $T\subseteq[n]$ | 可 |
+| 7 | $\mathsf{Noun}$ | 名詞ノード $(y,\hat x)$ | $\mu=\infty$ で不可 |
+| $-2$ | $\mathsf{Rational}$ | 有理数 $a/b$、$b>0$ | 可 |
+| $-3$ | $\mathsf{Chain}$ | cell 上の符号つき係数 | 可 |
+| $-4$ | $\mathsf{Region}$ | cell の集合 | 可 |
+| $8+k$ | $\#k$ | 正準参照したチェンバー | 参照先が決める |
+
+$\mathsf{Trace}$ と $\mathcal Q$ が複製できないのは、構成履歴を複製すると $ij$ と $ji$ の差が壊れるためになる(構成語 §3.5)。
+
+$\mathsf{Noun}$ の複製 `tu` は平文に置けない。平文は $\mu=\infty$ だからである(13 §1.2、07 §8.4)。
+書くと両方の compiler が image を出さずに止まる。
+
+## 3. 層を当てる
+
+層 $r$ の frontier を $F_r$ とする。層の箱を左から順に当てる手続きは三行で終わる。
+
+$$
+\begin{aligned}
+\texttt{ki} &:\quad \text{位置を一つ進める}\\
+g &:\quad F_r[\,q\,..\,q+|\Gamma^-_g|\,)=\Gamma^-_g\ \text{を検め、}\ \Gamma^+_g\ \text{を出力へ積む}\\
+F_{r+1} &=\ (\text{積んだ出力})\ \|\ (\text{残った位置})
+\end{aligned}
+\tag{3.1}
+$$
+
+型が合わなければそこで止まる。診断は構成語 §15.4 の名前で出る。
+
+```
+層 2: kukeke の入力型が合わない(型と座標の混同)
+層 1: ku の入力が frontier を越える(境界不一致)
+```
+
+## 4. 出口境界の読み
+
+$\Gamma^+$ に残った席は、成分の順で作業領域の語 $0,1,2,\ldots$ へ開く。
+
+| 型 | 開く語 |
+|---|---|
+| $\mathsf{Dyad}$、$\mathsf{Bit}$ | 分子 一語 |
+| $\mathsf{Point}$ | 実成分、無限成分 |
+| $\mathsf{Rational}$ | 分子、分母 |
+| $\mathcal Q$ | 大きさ $a$、$b$、語 $m$、$\varepsilon$、符号 |
+| $\mathsf{Noun}$ | 位置四語、目印の数、プロファイル |
+| $\mathsf{Region}$ | cell の数、cell 番号(昇順) |
+| $\mathsf{Chain}$ | 頂点の数、各頂点の(係数、頂点数 $1$、頂点番号) |
+
+深度は compile 時の事実なので、語には分子だけが載る。読む側が深度表から引く。
+
+$$
+\text{値}=\frac{\text{語}}{2^{\delta}},
+\qquad
+\delta\ \text{は build 時の型}
+$$
+
+## 参照
+
+- [01_source](01_source.md) 音節・層・frontier
+- [generators/Index](../generators/Index.md) 生成元ごとの $\Gamma^-\to\Gamma^+$
Index: trunk/assets/cmn_lang_ref/language/03_intent.md
===================================================================
trunk/assets/cmn_lang_ref/language/03_intent.md
new file mode 100644
--- a/trunk/assets/cmn_lang_ref/language/03_intent.md	(nonexistent)
+++ b/trunk/assets/cmn_lang_ref/language/03_intent.md	(revision 2)
@@ -0,0 +1,165 @@
+# 意図の判定条件
+
+[← Index](../Index.md)
+
+## 1. 何をもって意図と呼ぶか
+
+チェンバー $C$ について、値を得るのに要り、かつ本文に現れない量の集まりを $H(C)$ と置く。
+
+$$
+H(C)=\bigl\{\ \text{$\llbracket C\rrbracket$ を得るのに要り、かつ $C$ の本文に現れない量}\ \bigr\}
+$$
+
+$$
+\boxed{\ C\ \text{は意図}\iff H(C)=\varnothing\ }
+\tag{1.1}
+$$
+
+命令列は $H$ が空でない。`ke 1 0; ke 1 0; ko` は $2$ を返すが、なぜ足すか、
+いくつで止めるか、どれが答えかは本文の外に残る。
+
+04 §17 は答えの型を明示したチェンバーを「計算すべき問い」と呼ぶ。
+
+$$
+P:X\to\{0,1\},
+\qquad
+P:X\to[0,1],
+\qquad
+P:X\otimes Y\to\mathcal Q,
+\qquad
+P:X\to C
+$$
+
+出口型を持つ式だけを問いとして扱うと、「何を答えれば計算完了なのか」が構文の外に残らない。
+
+## 2. 手続きを書く場所が構文に無い生成元
+
+| 音節 | 生成元 | 書かずに済むもの |
+|---|---|---|
+| `yu` | $\bigvee$ | 探索順、打ち切り |
+| `zi` | $\Omega_a[\beta_a;x_0]$ | 反復回数、収束判定 |
+| `ye` `yo` | $\searrow$、$\swarrow$ | 逆算の手続き |
+| `na` `ni` `to` | $q\Leftrightarrow p$ | 分類器、特徴選択 |
+| `ne` | $\varphi_\partial\circ\pi$ | 閾値 |
+| `kukese` … `kuketi` | 領域の関係 | 走査、隣接リスト、経路探索 |
+
+どれも随伴・上限・不動点・幾何の関係になる。定義から一意に決まるので、
+手続きを書く席が構文の側に無い。
+
+## 3. 例:候補のうちいちばん良いもの
+
+`examples/intent/01_sup.cmn`
+
+$$
+P:X\otimes Y\to\mathcal Q,
+\qquad
+\bigvee_{y\in Y}P(x,y)
+$$
+
+候補 $Y=\{\tfrac12,\tfrac14,\tfrac34\}$、原型 $1$。評価は整合対 `na`($q\Leftrightarrow1$)になる。
+
+$$
+\bigvee\Bigl\{\tfrac12,\ \tfrac14,\ \tfrac34\Bigr\}=\tfrac34
+$$
+
+$\bigvee$ は完備束の上限なので結合的かつ可換になる(定理 3.3)。畳む順序は値を変えないから、
+探索順が本文に現れない。
+
+## 4. 例:半分ずつ寄っていく先
+
+`examples/intent/02_omega.cmn`
+
+$$
+x=\frac{x+a}{2}
+\ \Longrightarrow\
+x=a,
+\qquad
+\Omega_a[\beta_a;x_0]=a
+\tag{構成語 5.2}
+$$
+
+書くのは方程式と集積点だけになる。反復を回す箱は生成元レジストリに無い。
+
+## 5. 例:届かせるのに何が要るか
+
+`examples/intent/03_residual.cmn`
+
+$$
+a\star b\le c
+\iff
+b\le a\searrow c
+\iff
+a\le c\swarrow b
+\tag{定理 3.3}
+$$
+
+$$
+q\searrow c=\max\bigl\{\,r\ \bigm|\ q\star r\le c\,\bigr\}
+$$
+
+残差は随伴なので、$\max$ の中身を探す手続きが要らない。
+
+## 6. 例:幾何の問い
+
+領域の層は、走査を書かずに済む問いをまとめて与える([generators/region](../generators/region.md))。
+
+### 6.1 二つの場所は隣り合うか
+
+`examples/region/07_adjacent.cmn`
+
+```
+ma ma ka
+ki zu ka
+kukeke kukeke ka
+kuketa ka
+```
+
+$$
+A\ \text{と}\ B\ \text{は隣接}
+\iff
+A\cap B=\varnothing
+\ \wedge\
+\bigl((2A\cap B)\cup(A\cap 2B)\bigr)\neq\varnothing
+$$
+
+本文にあるのは「原点のノード」「$i$ で一歩進んだノード」「それぞれの単位領域」「隣接か」の四つになる。
+隣接リストも探索も現れない。
+
+### 6.2 この場所の集まりは一続きの道か
+
+`examples/region/09_path.cmn`(値 $1$)と `examples/region/10_gap.cmn`(値 $0$)
+
+道は Level 0 の原始概念であり、一次元の連結した領域になる(幾何 Index)。
+本文は領域を合わせて「道か」と問うだけで閉じる。幅優先探索も訪問済みの印も出てこない。
+
+### 6.3 閉じた曲面に境界は無い
+
+`examples/region/12_nilpotent.cmn`(値 $0$)
+
+$$
+\partial(\partial G)=\varnothing
+\tag{影響関数 証明3.2}
+$$
+
+$\mathbb R^3$ の閉じた曲面は内側と外側を分ける面であり、その面には境界が無い。
+冪零性は代数の要請ではなく、この幾何的事実の係数表現になる。
+
+## 7. 判定表
+
+| 例 | $H(C)$ に落ちそうな量 | 本文での扱い |
+|---|---|---|
+| 01_sup | 探索順、打ち切り | $\bigvee$ が可換かつ結合的 |
+| 02_omega | 反復回数、収束判定 | 集積点が方程式で決まる |
+| 03_residual | 逆算の手続き | 随伴が一意に決める |
+| 04_member | 閾値 | $\varphi_\partial$ が境界を持つ |
+| 07_adjacent | 隣接リスト、走査 | 幾何の関係が定義そのもの |
+| 09_path | 経路探索、訪問済みの印 | 道が Level 0 の原始概念 |
+| 12_nilpotent | 符号の相殺の手順 | $\partial^2=0$ が幾何的事実 |
+
+七本とも $H(C)=\varnothing$ になる。
+
+## 参照
+
+- [generators/judge](../generators/judge.md) 上限・残差・整合対
+- [generators/region](../generators/region.md) 領域と鎖
+- `continuous_republic/examples/intent/Index.md` 五本の詳細
Index: trunk/assets/cmn_lang_ref/toolchain/01_build.md
===================================================================
trunk/assets/cmn_lang_ref/toolchain/01_build.md
new file mode 100644
--- a/trunk/assets/cmn_lang_ref/toolchain/01_build.md	(nonexistent)
+++ b/trunk/assets/cmn_lang_ref/toolchain/01_build.md	(revision 2)
@@ -0,0 +1,148 @@
+# compile して走らせる
+
+[← Index](../Index.md)
+
+## 1. 誰が何を出すか
+
+$$
+\texttt{.cam}\ \xrightarrow{\ \text{Haskell}\ }\ \text{image}
+\qquad\qquad
+\texttt{.cmn}\ \xrightarrow{\ \text{commonc の image}\ }\ \text{image}
+$$
+
+Haskell が出してよいのはバイナリだけになる。`.cmn` を compile するのは常に
+commonc の image であり、その image を走らせるのは C か Python の実行台になる。
+
+```
+commonc/src/
+  front.cam       .cmn → 疑似命令。target を知らない
+  qlayer.cam      判定値 𝒬 の層
+  qword.cam       構成語の算術
+  region.cam      領域と鎖の層
+  back_x86h.cam   → commonc_x86h.cam
+  back_lane64.cam → commonc_lane64.cam
+```
+
+`use` は名前空間を一つにする。ラベルの解決は展開の後に一度だけ走る。
+
+$$
+\operatorname{res}(\texttt{use}\ f)=\operatorname{res}\bigl(\text{$f$ の中身をその行へ置いた source}\bigr)
+\tag{12.1.1}
+$$
+
+---
+
+## 2. 一本を走らせる
+
+### 2.1 core 意味論で読む
+
+```bash
+common continuous_republic/examples/cmn/futatsu.cmn --run
+```
+
+```
+source : .../futatsu.cmn  層 2  d係数=[2]
+境界   : [PtDyad]
+平文   : huhukanoka
+降下   : 箱 4  退避語 32
+  出力[0] = 2
+```
+
+### 2.2 commonc で compile する
+
+作業領域の刻みは入力から出る(19 式 3.1)。
+
+$$
+B=\max(N+80,\ 4096),
+\qquad
+\mathrm{InBase}=288B,
+\qquad
+\mathrm{Words}=288B+N+4096
+$$
+
+$288$ は lane64 の覆いの倍数になる。x86-64 hosted 版では $128$ を採る。
+
+```bash
+python continuous_republic/common_systems/Python_vCPU/vcpu.py \
+  builds/commonc/commonc_lane64.bin \
+  --words 1183761 --in-base 1179648 \
+  --in continuous_republic/examples/cmn/futatsu.cmn \
+  --emit out.bin
+```
+
+### 2.3 出た image を走らせる
+
+```bash
+python continuous_republic/common_systems/Python_vCPU/vcpu.py out.bin --words 4096 --dump 1
+```
+
+```
+lane 0    tu
+  w[0] = 2
+```
+
+`tu` が成功報告、`te` が失敗報告になる(10 §2)。
+
+---
+
+## 3. 実行台
+
+| 実行台 | 走らせ方 | 中身 |
+|---|---|---|
+| C | `builds/common-host/common_host.exe` | thread で lane を配る |
+| Python 翻訳器 | `vcpu.py` | image を Python の文へ落とす |
+| Python 解釈器 | `vcpu.py --interp` | 式 (2.1) の mask 付き意味をそのまま持つ |
+| GPU | `vcpu.py --cupy` | 語も述語も bit のまま持つ(cuvcpu) |
+
+どれも image の中身を読まない。
+
+---
+
+## 4. 検査
+
+```bash
+continuous_republic/common_systems/common_lang/commonc/tools/Check.ps1 -Cupy
+```
+
+三つを同時に見る。
+
+$$
+\operatorname{commonc}_{\mathrm{x86h}}(\texttt{.cmn})=\operatorname{Compile}_{\mathrm{x86h}}(\texttt{.cmn})
+\qquad\text{byte 単位}
+\tag{19.5.1}
+$$
+
+$$
+\bigl\llbracket\operatorname{commonc}_{\mathrm{lane64}}(\texttt{.cmn})\bigr\rrbracket
+=\bigl\llbracket\operatorname{Desc}(\texttt{.cmn})\bigr\rrbracket_C
+\tag{19.43.2}
+$$
+
+GPU の実行台の観測も同じ列に並ぶ。
+
+```
+07_adjacent      式(5.1) 一致     式(43.2) 一致     分子 1 / 1  GPU 一致     1
+```
+
+降下の表に無い箱を含む平文は、どちらも image を出さない。それも一致のうちになる。
+
+```
+tu_no_copy       式(5.1) 一致     式(43.2) 一致     分子 — / —
+```
+
+`.cam` が image を出さなかったときは、そこで止まる。古い image で走ると、
+直したはずの誤りが検査を通ってしまう。
+
+### 他の runner
+
+| runner | 何を走らせるか |
+|---|---|
+| `common_assembler/tools/BuildAndRun.ps1` | 全体 |
+| `common_lang/common_lang/tools/Run.ps1` | 意味 program 14 本を C と Python で |
+| `Python_vCPU/tools/Run.ps1` | lane64 の image を翻訳器と解釈器で |
+| `reverse2tensor/tools/Run.ps1` | 平文からテンソルへの逆写像 |
+| `examples/edu/run.py` | 採用語彙を展開してから走らせる |
+
+## 参照
+
+- [02_targets](02_targets.md) target と実行台の対
Index: trunk/assets/cmn_lang_ref/toolchain/02_targets.md
===================================================================
trunk/assets/cmn_lang_ref/toolchain/02_targets.md
new file mode 100644
--- a/trunk/assets/cmn_lang_ref/toolchain/02_targets.md	(nonexistent)
+++ b/trunk/assets/cmn_lang_ref/toolchain/02_targets.md	(revision 2)
@@ -0,0 +1,114 @@
+# target と実行台
+
+[← Index](../Index.md)
+
+## 1. build family
+
+$$
+\mathscr B(P)=\bigl\{(T,\ \operatorname{Compile}_T(P))\ \bigm|\ T\in\mathcal T\bigr\}
+$$
+
+**定理 33.1** $\mathcal T$ の増減は $\operatorname{Sem}(P)$ を変えない。
+
+core は target 名を知らない。build の結果は一つの組で返る。
+
+$$
+\mathrm{Built}_T=\bigl(\text{name}(T),\ X_T,\ \llbracket X_T\rrbracket_T,\ \{R_i\}\bigr)
+$$
+
+第一成分は package が持つ data であり、core の型には現れない。
+
+---
+
+## 2. 登録済みの target
+
+| target 名 | 章 | 実行台 |
+|---|---|---|
+| `riscv64` | 06 | QEMU virt |
+| `arm64` | 05 | QEMU virt + semihosting |
+| `x86_64` | 04 | QEMU pc + multiboot |
+| `x86_64-hosted` | 18 | `common_host`(彩色した覆い) |
+| `x86_64-hosted-w` | 18、19 §6 | `common_host`(語割付けの覆い) |
+| `gfx1200` | 08 | package 内蔵 simulator |
+| `sm_120` | 09 | package 内蔵 simulator |
+| `lane64` | 20 | `Python_vCPU/vcpu.py` |
+
+```bash
+common <src> -t <target> -o <image>
+```
+
+`-t` を省くと登録済みの全 target で build して結果を並べる。
+
+---
+
+## 3. compile の段
+
+$$
+\operatorname{Compile}_{T,\mu}
+=\operatorname{Pack}_T\circ\operatorname{Link}_T\circ\operatorname{Encode}_A
+\circ\operatorname{Schedule}_A\circ\operatorname{Allocate}_A\circ\operatorname{Cover}_{A,\mu}
+\circ\operatorname{Refine}_{T,\mu}\circ\operatorname{CNF}_\infty\circ\operatorname{Parse}
+$$
+
+$\operatorname{Parse}$ から $\operatorname{Refine}$ までが target 非依存の core になり、
+$\operatorname{Cover}$ 以降が architecture package に属する(定理 52.1)。
+
+---
+
+## 4. lane64
+
+実行位相を state の第一成分に置く(20 章)。
+
+$$
+T=c_{\mathrm{dis}}B+\sum_i\beta_i\nu_i
+$$
+
+| | x86-64 | lane64 |
+|---|---|---|
+| scalar register | 持つ | lane へ複製する |
+| 箱あたりの byte | 最大 33 | 112 |
+| 覆いの倍数 | 128 | 288 |
+
+`vcpu.py` は三つの道を持つ。
+
+| 道 | 何をするか |
+|---|---|
+| 翻訳器(既定) | image を Python の文へ落とす |
+| `--interp` | 式 (2.1) の mask 付き意味をそのまま解釈する |
+| `--cupy` | 語も述語も bit のまま GPU で走らせる |
+
+GPU の道は語を bit 平面で持つ。
+
+$$
+V\in\mathbb B^{NB\times W},
+\qquad
+m\in\mathbb B^{W}
+$$
+
+lane の bit がそのまま述語 mask になるので、選択が `(new & m) | (old & ~m)` の一行になる。
+加算は Kogge-Stone で $\log NB$ 段に畳み、乗算は carry-save で潰す。
+
+語の幅 $NB$ は引数になる(既定 32)。lane64 の語は $\mathbb Z$ なので、
+$NB$ bit を越えた時点で core 意味論と離れる。越えたら桁上がりを見て報告する。
+
+```bash
+python vcpu.py <image> --words 4096 --dump 1 --cupy --bits 32
+```
+
+---
+
+## 5. 三つの道の一致
+
+`Check.ps1 -Cupy` が corpus の全部で三つを突き合わせる。
+
+$$
+\llbracket X\rrbracket_{\text{翻訳器}}
+=\llbracket X\rrbracket_{\text{解釈器}}
+=\llbracket X\rrbracket_{\mathrm{GPU}}
+=\llbracket\operatorname{Desc}(\texttt{.cmn})\rrbracket_C
+$$
+
+## 参照
+
+- [01_build](01_build.md) compile して走らせる
+- `docs/common-compiler/arch/20_lane64_package.md` lane64 の仕様
Index: trunk/examples/cmn/futatsu.bin
===================================================================
trunk/examples/cmn/futatsu.bin
new file mode 100644
--- a/trunk/examples/cmn/futatsu.bin	(nonexistent)
+++ b/trunk/examples/cmn/futatsu.bin	(revision 2)
@@ -0,0 +1,2 @@
+@	A	@AB	C	CB	
+
\ No newline at end of file
Index: trunk/examples/cmn/futatsu.cmn
===================================================================
trunk/examples/cmn/futatsu.cmn
new file mode 100644
--- a/trunk/examples/cmn/futatsu.cmn	(nonexistent)
+++ b/trunk/examples/cmn/futatsu.cmn	(revision 2)
@@ -0,0 +1 @@
+hu hu ka, no ka.
Index: trunk/examples/cmn/hitotsu.cmn
===================================================================
trunk/examples/cmn/hitotsu.cmn
new file mode 100644
--- a/trunk/examples/cmn/hitotsu.cmn	(nonexistent)
+++ b/trunk/examples/cmn/hitotsu.cmn	(revision 2)
@@ -0,0 +1 @@
+hu hu hu hu ka, no ki ha ka, ki no ka, ki se ka, ti ka.
Index: trunk/examples/cmn/tsuiki.cmn
===================================================================
trunk/examples/cmn/tsuiki.cmn
new file mode 100644
--- a/trunk/examples/cmn/tsuiki.cmn	(nonexistent)
+++ b/trunk/examples/cmn/tsuiki.cmn	(revision 2)
@@ -0,0 +1,2 @@
+hu ka, se ka, se ka, ho ka.
+hu ka, he ka, no ka.
Index: trunk/examples/cmn/tsuisuu.cmn
===================================================================
trunk/examples/cmn/tsuisuu.cmn
new file mode 100644
--- a/trunk/examples/cmn/tsuisuu.cmn	(nonexistent)
+++ b/trunk/examples/cmn/tsuisuu.cmn	(revision 2)
@@ -0,0 +1 @@
+we re ka, ki sa ka, ki si ka, ki wi ka, gi ka.
Index: trunk/examples/cmn/yonbunnosan.cmn
===================================================================
trunk/examples/cmn/yonbunnosan.cmn
new file mode 100644
--- a/trunk/examples/cmn/yonbunnosan.cmn	(nonexistent)
+++ b/trunk/examples/cmn/yonbunnosan.cmn	(revision 2)
@@ -0,0 +1 @@
+hu hu ka, ki ha ka, no ka, se ka, se ka.
Index: trunk/examples/edu/ref_memo.md
===================================================================
trunk/examples/edu/ref_memo.md
new file mode 100644
--- a/trunk/examples/edu/ref_memo.md	(nonexistent)
+++ b/trunk/examples/edu/ref_memo.md	(revision 2)
@@ -0,0 +1,86 @@
+# referenceとは呼べない程度の備忘録
+
+Common言語にしろコモン公用語にしろ、根底にあるのは数学で、5みたいな小さい自然数を定義するのにすら
+
+"""
+hu hu hu hu hu ka, no ka, no ka, no ka, no ka.
+
+hu ka, he ka, no ka, he ka, no ka, hu ka, no ka. 
+
+hu ka, hu ka, no ka, he ka, no ka. hu ka, no ka.
+
+hu ka, he ka, no ka, he ka, no ka, ki hu ka, no ka.
+"""
+
+など、複数の解法がある。
+
+これだけだとこの語彙が何を言っているか?は分かりにくいが、下に説明すると:
+
+hu : 最初に書く「1」。
+    この1を操作する。基本的にこれがないとプログラムは始まらない。
+
+he : コピー。
+    与えられた語の値の順番の語をコピーしてw[0]に値を置く。
+
+ka : 句読点。
+    操作を区切る。これがあって操作を区切ることができる(逆に言えば、無ければ区切られない)。
+
+no : 加算。
+    加算の操作。二つの対象があって初めて適用可能(当然ながら)。
+
+ha : 負にする・裏返す。
+    実はコモン公用語において引き算は存在しない。引き算をしたいなら、引く数を裏返す必要がある。hukahakaなら-1を作るだけ。
+
+mu : 書き込み・左の語番号に右の値を書き込む。
+    上に今まで挙がった中で唯一の左右による作用の違いを持つ単語。左の値で定義された語を右の値の語に書き込む。つまり、 **右の値が語の番号。左の単語は語の中身** になる。普通のプログラミングっぽく言えば、右がメモリアドレス。左が値。まぁそんな単純な話ではもちろんないんだけど...。
+    それと、できるだけ1とかあまりにも小さい語を指定すべきではない。プログラムにも寄るけど、基本的に小さい語は新しい語の定義に一時的に使う。大きい語を一時メモリに使おう。
+
+me : 成功報告・C言語のreturn 0みたいなやつ。
+    frontierが空っぽのまま実行終了したいときに必要な単語。
+
+mi : 非破壊読み出し・語番号を作る。
+    Common言語で状態を読み出す唯一の方法。入力は語番号で、中身の語を返す。非破壊読み出し。
+
+hi : 比較器
+    左の語の値が右の語の値より小さければ1、左の語の値が右の語の値より大きければ0。
+
+mo : 忘れる・語の値を捨てる
+    frontierをw[0]に戻す。
+
+区切りがなければ操作は適用されるため、こういうトリッキーなこともできる:
+
+    すべての hu ka 。つまり1をまとめるためにnoを多重につける。 
+    hu ka, hu ka, hu ka, hu ka, hu ka, hu ka, hu ka, no no no ka, no no ka, no ka.
+    = 7
+
+    最後のno kaをなくしてみる。
+    hu ka, hu ka, hu ka, hu ka, hu ka, hu ka, hu ka,no no no ka, no no ka.
+    = 4, 3
+
+    no no ka も消す。
+    hu ka, hu ka, hu ka, hu ka, hu ka, hu ka, hu ka,no no no ka.
+    =  2, 2, 2, 1
+
+    1が残っていてきしょいので、7個のhu ka 定義のうち最後のhu kaを一つ消して6個にする。
+    hu ka, hu ka, hu ka, hu ka, hu ka, hu ka,no no no ka. 
+
+    8を作ってから1 = hu kaを裏返して引いてみる。ついでにhu ka を8つ定義するためのkaを省略する。
+
+    hu hu hu hu hu hu hu hu ka, no no no no ka, no no ka, no ka.
+
+    hu ka, ha ka. no ka.
+
+    同じことを、8を作るうえで8つバカ正直に1を定義するのは愚かなので、文明人らしく2進数風に書いてみる。
+
+    hu ka, he ka, no ka, he ka, no ka, he ka, no ka.
+
+    hu ka, ha ka. no ka.
+
+    天邪鬼なことに、-8をつくってから戻して計算する。
+
+    hu ka, ha ka, he ka, no ka, he ka, no ka, he ka, no ka.
+
+    hu ka. no ka, ha ka.
+
+brainfuck言語みがあるのは確かにそう...。
+
Index: trunk/examples/edu/user/order_programming/12_on_word_8.bin
===================================================================
trunk/examples/edu/user/order_programming/12_on_word_8.bin
new file mode 100644
--- a/trunk/examples/edu/user/order_programming/12_on_word_8.bin	(nonexistent)
+++ b/trunk/examples/edu/user/order_programming/12_on_word_8.bin	(revision 2)
@@ -0,0 +1,2 @@
+			
+
\ No newline at end of file
Index: trunk/examples/edu/user/order_programming/12_on_word_8.cmn
===================================================================
trunk/examples/edu/user/order_programming/12_on_word_8.cmn
new file mode 100644
--- a/trunk/examples/edu/user/order_programming/12_on_word_8.cmn	(nonexistent)
+++ b/trunk/examples/edu/user/order_programming/12_on_word_8.cmn	(revision 2)
@@ -0,0 +1,12 @@
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka.
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka.
+mu ka.
+
+hu ka, he ka, no ka, he ka, no ka.
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka.
+mi ka, no ka.
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka.
+mu ka.
+
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka hu ka, no ka..
+mi ka. he ka. no ka.
\ No newline at end of file
Index: trunk/examples/edu/user/order_programming/comparator.bin
===================================================================
trunk/examples/edu/user/order_programming/comparator.bin
new file mode 100644
--- a/trunk/examples/edu/user/order_programming/comparator.bin	(nonexistent)
+++ b/trunk/examples/edu/user/order_programming/comparator.bin	(revision 2)
@@ -0,0 +1,3 @@
+			 			
+		
+
\ No newline at end of file
Index: trunk/examples/edu/user/order_programming/comparator.cmn
===================================================================
trunk/examples/edu/user/order_programming/comparator.cmn
new file mode 100644
--- a/trunk/examples/edu/user/order_programming/comparator.cmn	(nonexistent)
+++ b/trunk/examples/edu/user/order_programming/comparator.cmn	(revision 2)
@@ -0,0 +1,26 @@
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka.
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka.
+mu ka.
+hu ka, he ka, no ka, he ka, no ka.
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka.
+mi ka, no ka.
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka hu ka, ha ka, no ka.
+mu ka.
+
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka.
+mi ka. ha ka.
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka, he ka, no ka.
+mu ka.
+
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka hu ka, he ka, no ka, ha ka, no ka.
+
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka hu ka, ha ka, no ka.
+mi ka.
+hu ka, he ka, no ka, he ka, no ka, he ka, no ka, he ka, no ka.
+mi ka.
+
+hi ka.
+
+hu ka.
+hu ka, he ka, no ka, he ka, no ka, hu ka, no ka, hu ka, no ka.
+mu ka. me ka.
\ No newline at end of file
Index: trunk/examples/edu/user/order_programming/double_time.bin
===================================================================
trunk/examples/edu/user/order_programming/double_time.bin
new file mode 100644
--- a/trunk/examples/edu/user/order_programming/double_time.bin	(nonexistent)
+++ b/trunk/examples/edu/user/order_programming/double_time.bin	(revision 2)
@@ -0,0 +1,2 @@
+	
+
\ No newline at end of file
Index: trunk/examples/edu/user/order_programming/double_time.cmn
===================================================================
trunk/examples/edu/user/order_programming/double_time.cmn
new file mode 100644
--- a/trunk/examples/edu/user/order_programming/double_time.cmn	(nonexistent)
+++ b/trunk/examples/edu/user/order_programming/double_time.cmn	(revision 2)
@@ -0,0 +1 @@
+hu ka, he ka, no ka.
\ No newline at end of file
Index: trunk/examples/edu/user/order_programming/eight_minus_one.bin
===================================================================
trunk/examples/edu/user/order_programming/eight_minus_one.bin
new file mode 100644
--- a/trunk/examples/edu/user/order_programming/eight_minus_one.bin	(nonexistent)
+++ b/trunk/examples/edu/user/order_programming/eight_minus_one.bin	(revision 2)
@@ -0,0 +1,2 @@
+	
+
\ No newline at end of file
Index: trunk/examples/edu/user/order_programming/eight_minus_one.cmn
===================================================================
trunk/examples/edu/user/order_programming/eight_minus_one.cmn
new file mode 100644
--- a/trunk/examples/edu/user/order_programming/eight_minus_one.cmn	(nonexistent)
+++ b/trunk/examples/edu/user/order_programming/eight_minus_one.cmn	(revision 2)
@@ -0,0 +1,3 @@
+hu ka, ha ka, he ka, no ka, he ka, no ka, he ka, no ka.
+
+hu ka. no ka, ha ka.
\ No newline at end of file
Index: trunk/examples/edu/user/order_programming/five.bin
===================================================================
trunk/examples/edu/user/order_programming/five.bin
new file mode 100644
--- a/trunk/examples/edu/user/order_programming/five.bin	(nonexistent)
+++ b/trunk/examples/edu/user/order_programming/five.bin	(revision 2)
@@ -0,0 +1,2 @@
+			
+
\ No newline at end of file
Index: trunk/examples/edu/user/order_programming/five.cmn
===================================================================
trunk/examples/edu/user/order_programming/five.cmn
new file mode 100644
--- a/trunk/examples/edu/user/order_programming/five.cmn	(nonexistent)
+++ b/trunk/examples/edu/user/order_programming/five.cmn	(revision 2)
@@ -0,0 +1 @@
+hu ka, hu ka, hu ka, hu ka, hu ka, hu ka,no no no ka.
\ No newline at end of file
Index: trunk/examples/edu/user/order_programming/plus_one.bin
===================================================================
trunk/examples/edu/user/order_programming/plus_one.bin
new file mode 100644
--- a/trunk/examples/edu/user/order_programming/plus_one.bin	(nonexistent)
+++ b/trunk/examples/edu/user/order_programming/plus_one.bin	(revision 2)
@@ -0,0 +1,2 @@
+	
+
\ No newline at end of file
Index: trunk/examples/edu/user/order_programming/plus_one.cmn
===================================================================
trunk/examples/edu/user/order_programming/plus_one.cmn
new file mode 100644
--- a/trunk/examples/edu/user/order_programming/plus_one.cmn	(nonexistent)
+++ b/trunk/examples/edu/user/order_programming/plus_one.cmn	(revision 2)
@@ -0,0 +1 @@
+hu ka, ki hu ka, no ka.
\ No newline at end of file
Index: trunk/examples/llvm/count.ll
===================================================================
trunk/examples/llvm/count.ll
new file mode 100644
--- a/trunk/examples/llvm/count.ll	(nonexistent)
+++ b/trunk/examples/llvm/count.ll	(revision 2)
@@ -0,0 +1,16 @@
+; %n0 を 0 まで数え下げ、回数を返す。単調停止フラグと omega 読みの見本
+define i4 @count(i4 %n0) {
+e:
+  br label %l
+l:
+  %n = phi i4 [ %n0, %e ], [ %n1, %s ]
+  %k = phi i4 [ 0, %e ], [ %k1, %s ]
+  %z = icmp eq i4 %n, 0
+  br i1 %z, label %x, label %s
+s:
+  %n1 = sub nsw i4 %n, 1
+  %k1 = add nsw i4 %k, 1
+  br label %l
+x:
+  ret i4 %k
+}
Index: trunk/examples/llvm/memsum.ll
===================================================================
trunk/examples/llvm/memsum.ll
new file mode 100644
--- a/trunk/examples/llvm/memsum.ll	(nonexistent)
+++ b/trunk/examples/llvm/memsum.ll	(revision 2)
@@ -0,0 +1,10 @@
+; メモリ窓へ二語書き、読み直して足す。load / store のマルチプレクサの見本
+define i8 @memsum(i8 %a, i8 %b) {
+e:
+  store i8 %a, ptr 0
+  store i8 %b, ptr 1
+  %x = load i8, ptr 0
+  %y = load i8, ptr 1
+  %s = add i8 %x, %y
+  ret i8 %s
+}
Index: trunk/examples/llvm/min.ll
===================================================================
trunk/examples/llvm/min.ll
new file mode 100644
--- a/trunk/examples/llvm/min.ll	(nonexistent)
+++ b/trunk/examples/llvm/min.ll	(revision 2)
@@ -0,0 +1,13 @@
+; 小さい方を返す。分岐と phi(pc_prev の読み)の見本
+define i8 @min(i8 %a, i8 %b) {
+e:
+  %c = icmp ult i8 %a, %b
+  br i1 %c, label %t, label %f
+t:
+  br label %m
+f:
+  br label %m
+m:
+  %y = phi i8 [ %a, %t ], [ %b, %f ]
+  ret i8 %y
+}
Index: trunk/examples/region/01_cell.cmn
===================================================================
trunk/examples/region/01_cell.cmn
new file mode 100644
--- a/trunk/examples/region/01_cell.cmn	(nonexistent)
+++ b/trunk/examples/region/01_cell.cmn	(revision 2)
@@ -0,0 +1,2 @@
+ma ka
+kukeke ka
Index: trunk/examples/region/02_meet.cmn
===================================================================
trunk/examples/region/02_meet.cmn
new file mode 100644
--- a/trunk/examples/region/02_meet.cmn	(nonexistent)
+++ b/trunk/examples/region/02_meet.cmn	(revision 2)
@@ -0,0 +1,4 @@
+ma ma ka
+ki zu ka
+kukeke kukeke ka
+kukeko ka
Index: trunk/examples/region/03_join.cmn
===================================================================
trunk/examples/region/03_join.cmn
new file mode 100644
--- a/trunk/examples/region/03_join.cmn	(nonexistent)
+++ b/trunk/examples/region/03_join.cmn	(revision 2)
@@ -0,0 +1,4 @@
+ma ma ka
+ki zu ka
+kukeke kukeke ka
+kukesa ka
Index: trunk/examples/region/04_outside.cmn
===================================================================
trunk/examples/region/04_outside.cmn
new file mode 100644
--- a/trunk/examples/region/04_outside.cmn	(nonexistent)
+++ b/trunk/examples/region/04_outside.cmn	(revision 2)
@@ -0,0 +1,5 @@
+ma ma ma ka
+ki zu ki ka
+kukeke kukeke kukeke ka
+kukesa ki ka
+kukesi ka
Index: trunk/examples/region/05_contains.cmn
===================================================================
trunk/examples/region/05_contains.cmn
new file mode 100644
--- a/trunk/examples/region/05_contains.cmn	(nonexistent)
+++ b/trunk/examples/region/05_contains.cmn	(revision 2)
@@ -0,0 +1,5 @@
+ma ma ma ka
+ki zu ki ka
+kukeke kukeke kukeke ka
+kukesa ki ka
+kukese ka
Index: trunk/examples/region/06_overlaps.cmn
===================================================================
trunk/examples/region/06_overlaps.cmn
new file mode 100644
--- a/trunk/examples/region/06_overlaps.cmn	(nonexistent)
+++ b/trunk/examples/region/06_overlaps.cmn	(revision 2)
@@ -0,0 +1,3 @@
+ma ma ka
+kukeke kukeke ka
+kukeso ka
Index: trunk/examples/region/07_adjacent.cmn
===================================================================
trunk/examples/region/07_adjacent.cmn
new file mode 100644
--- a/trunk/examples/region/07_adjacent.cmn	(nonexistent)
+++ b/trunk/examples/region/07_adjacent.cmn	(revision 2)
@@ -0,0 +1,4 @@
+ma ma ka
+ki zu ka
+kukeke kukeke ka
+kuketa ka
Index: trunk/examples/region/08_apart.cmn
===================================================================
trunk/examples/region/08_apart.cmn
new file mode 100644
--- a/trunk/examples/region/08_apart.cmn	(nonexistent)
+++ b/trunk/examples/region/08_apart.cmn	(revision 2)
@@ -0,0 +1,4 @@
+ma ma ka
+ki ze ka
+kukeke kukeke ka
+kuketa ka
Index: trunk/examples/region/09_path.cmn
===================================================================
trunk/examples/region/09_path.cmn
new file mode 100644
--- a/trunk/examples/region/09_path.cmn	(nonexistent)
+++ b/trunk/examples/region/09_path.cmn	(revision 2)
@@ -0,0 +1,5 @@
+ma ma ka
+ki zu ka
+kukeke kukeke ka
+kukesa ka
+kuketi ka
Index: trunk/examples/region/10_gap.cmn
===================================================================
trunk/examples/region/10_gap.cmn
new file mode 100644
--- a/trunk/examples/region/10_gap.cmn	(nonexistent)
+++ b/trunk/examples/region/10_gap.cmn	(revision 2)
@@ -0,0 +1,5 @@
+ma ma ka
+ki ze ka
+kukeke kukeke ka
+kukesa ka
+kuketi ka
Index: trunk/examples/region/11_boundary.cmn
===================================================================
trunk/examples/region/11_boundary.cmn
new file mode 100644
--- a/trunk/examples/region/11_boundary.cmn	(nonexistent)
+++ b/trunk/examples/region/11_boundary.cmn	(revision 2)
@@ -0,0 +1,3 @@
+ma ka
+kukeke ka
+kukesu ka
Index: trunk/examples/region/12_nilpotent.cmn
===================================================================
trunk/examples/region/12_nilpotent.cmn
new file mode 100644
--- a/trunk/examples/region/12_nilpotent.cmn	(nonexistent)
+++ b/trunk/examples/region/12_nilpotent.cmn	(revision 2)
@@ -0,0 +1,4 @@
+ma ka
+kukeke ka
+kukesu ka
+bi ka
Index: trunk/examples/region/13_chainsum.cmn
===================================================================
trunk/examples/region/13_chainsum.cmn
new file mode 100644
--- a/trunk/examples/region/13_chainsum.cmn	(nonexistent)
+++ b/trunk/examples/region/13_chainsum.cmn	(revision 2)
@@ -0,0 +1,5 @@
+ma ma ka
+ki ze ka
+kukeke kukeke ka
+kukesu kukesu ka
+bu ka
Index: trunk/examples/region/14_bit_to_sum.cmn
===================================================================
trunk/examples/region/14_bit_to_sum.cmn
new file mode 100644
--- a/trunk/examples/region/14_bit_to_sum.cmn	(nonexistent)
+++ b/trunk/examples/region/14_bit_to_sum.cmn	(revision 2)
@@ -0,0 +1,6 @@
+ma ma ka
+kukeke kukeke ka
+kukeso ka
+mo ka
+hu ki ka
+no ka
Index: trunk/examples/region/15_bit_to_leq.cmn
===================================================================
trunk/examples/region/15_bit_to_leq.cmn
new file mode 100644
--- a/trunk/examples/region/15_bit_to_leq.cmn	(nonexistent)
+++ b/trunk/examples/region/15_bit_to_leq.cmn	(revision 2)
@@ -0,0 +1,5 @@
+ma ma ka
+kukeke kukeke ka
+kukeso ka
+mo hu ka
+hi ka
Index: trunk/kernel/__pycache__/generators.cpython-313.pyc
===================================================================
trunk/kernel/__pycache__/generators.cpython-313.pyc
new file mode 100644
--- a/trunk/kernel/__pycache__/generators.cpython-313.pyc	(nonexistent)
+++ b/trunk/kernel/__pycache__/generators.cpython-313.pyc	(revision 2)
@@ -0,0 +1,171 @@
+�
+
+���j"�
+��SrSrSrSrSr0SS_SS_S	S
+_SS_S
+S_SS_SS_SS_SS_SS_SS_SS_SS_SS _S!S"_S#S$_S%S&_0S'S(_S)S*_S+S,_S-S._S/S0_S1S2_S3S4_S5S6_S7S8_S9S:_S;S<_S=S>_S?S@_SASB_SCSD_SESF_SGSH_E0SISJ_SKSL_SMSN_SOSP_SQSR_SSST_SUSV_SWSX_SYSZ_S[S\_S]S^_S_S`_SaSb_ScSd_SeSf_SgSh_SiSj_ErSkSlSmSnSoSpSqSrSsSt.	rSurSvrSwr	Sxr
+SyrSzrS}S|jr
+g{)~u�音節と生成元の対応表。
+
+doc: plain.format commonc.generators casm.generators
+
+音節番号は生成順で決まる(19 式 2.1)。
+
+    idx(cv) = 5 ord(c) + ord(v)
+    C = (k s t n h m y r w g z d b p),  V = (a i u e o)
+
+commonc の SYL 配列(19 §3.2)はこの番号をそのまま並べる。表はそこから引く。
+
+範囲は三つに分かれる。
+
+    idx <= 59      一音節の生成元
+    idx 60..69     見出しの字母 Σ_V = {be bo pa pi pu pe po}(06 §17)
+    ku + 二音節    三音節の生成元。領域の語(region.cam)
+
+pin と pout は境界語を一段動かす幅(13 式 1.2)。boxes は Desc が開く MBox の本数
+(16 §5)で、0 の語は実行費用を持たない。
+�kstnhmyrwgzdbp�aiueoc�4�[US-[US--$)u!音節番号から綴りを返す�)�	CONSONANT�VOWEL)�idxs �4/mnt/data/common_scope_notebook/kernel/generators.py�namer
+s���S�A�X���s�Q�w��/�/�c�j�S[RUS5-[RUS5-$)u!綴りから音節番号を返すr��)r�indexr)�syls r	rr s,���y���s�1�v�&�&����S��V�)<�<�<r�ka)u	層境界r
+r
+r
+�frame�ki)�idrrr
+r�ku)u
+零標示 z_er
+r
+r
+r�hu)�oner
+rr�dyad�no)u⊕�rrr�ha)u⊖rrrr�ti)u⋆rrrr�se)uβrr�r�he)uΔrrr
+r�ho)�!rr
+r
+r�so)uφ∂rr��bit�hi)u≤rrr#r$�mo)uπrrr
+r$�mi)�Loadrrr�store�mu)�Storerr
+rr)�ya)u	Ω 開きr
+r
+r
+�omega�yi)u	Ω 閉じrr
+rr-�to)u	整合対rrN�judge�na)u原型 1 と整合rrNr0�ni)u原型 0 と整合rrNr0�nu)u⋆_QrrNr0�ne)u所属rrNr0�yu)u⋁rrNr0�ye)u↘rrNr0�yo)u↙rrNr0�ra)u≤_QrrNr0�ri)�homrrNr0�ru)uπ_QrrNr0�go)uΘrrNr0�bi)u∂rrr
+�region�bu)u⊕ 鎖rrr
+r>�re)�tracer
+rN�plane�sa)�irrNrB�si)�jrrNrB�ke)rrrNrB�su)u	⊖ tracerrNrB�ro)uρ⁻rrNrB�wa)uρ⁺rrNrB�wi)�endpointrrNrB�ko)zid coordrrNrB�ta)u	⊕ coordrrNrB�de)u	実成分rrNrB�do)u無限成分rrNrB�wu)�Er
+rNrB�we)�R_rr
+rNrB�wo)�R_ijr
+rNrB�ga)u合成rrNrB�gi)�act�rNrB�me)�Okr
+r
+r�report�di)�Kor
+r
+rr]�du)�Putrr
+rr])u領域rrr
+r>)u	共通部rrr
+r>)u	合わせrrr
+r>)u外側rrr
+r>)u
+境界 ∂rrr
+r>)u含まれるrrrr>)u	重なりrrrr>)u隣接rrrr>)u道rrrr>)	�kukeke�kukeko�kukesa�kukesi�kukesu�kukese�kukeso�kuketa�kuketi)�be�bo�pa�pi�pu�pe�por
+rrc���UVs/sHnSUs=::aS::dMO MUPM nn[U5S-(a [SSRUSS5-5e/n[S[U5S5HpnX$X$S	-pQU[;d
+U[
+;a[S
+U<U<35eUR
+S[RU5-[
+RU5-5 Mr U$s snf)u�filter_Σ(16 §1.1、19 式 4.1)。音節表の外の字を落として番号の列にする。
+
+ASCII 小文字が音節へ切れない所は誤りになる。
+�a�zru(音節の途中で切れている: ...%s������Nr
+ru音節表に無い綴り: r)�len�
+ValueError�join�rangerr�appendr)�text�c�keep�out�k�vs      r	�streamr��s���
+�/�t�!�s�a��3��A��A�t�D�/�
+�4�y�1�}��C�b�g�g�d�SU�SV�i�FX�X�Y�Y�
+�C�
+�1�c�$�i��
+#���w���U��1��I���%����A�F�G�G��
+�
+�1�y���q�)�)�E�K�K��N�:�;�	$�
+�J��0s�C'�C'�C'c�d�[RU5=(d [RU5$)uQ綴りから (記号, pin, pout, 箱, 層) を返す。表に無い綴りは None)�TRIPLE�get�ATOM)�spellings r	�lookr��s���:�:�h��5�4�8�8�H�#5�5rNc
+��U=(d 0n/nSn[U5nX4:Gaa[X5nUS:XahUS-U:a_U[XS-5-[XS-5-n[RU5nU(aUR	U4U-S-5 US-
+nM�U[
+;a�UnSn	X�:aF[X5[
+;a1U	[X5-
+n	US-
+nX�:a[X5[
+;aM1URU	S5up�nUR	U	S	X�US
+X�-
+45 UnGM
+[RU5nU(aUR	U4U-S-5 OUR	USSSS
+SS45 US-
+nX4:aGMaU$)u�SYL の番号列を語へ切る。返りは (綴り, 記号, pin, pout, 箱, 層, 長さ)。
+
+ku で始まる三音節は一語にまとめる。見出しの字母が続く区間も一語にまとめる
+ので、採用語彙の見出しがそのまま画面に出る。
+
+lexicon は {見出し: (pin, pout, 箱)}。見出しは文を差し込む(16 式 1.6)ので、
+境界の幅は差し込む文が決める。渡さないと幅 0 として置く。
+r
+rrr)rZrZru)r
+r
+Nu	見出し�letter)ru	未登録N�unknown)rwr
+r�r�r{�LETTERSr�)
+r�lexiconrrD�n�s�t�hitrF�word�pin�pout�bxs
+             r	�readr��s{���m��G�
+�C�	�A��C��A�
+�%����L����9��Q�����D���U��$�$�t�C�A��J�'7�7�A��*�*�Q�-�C���
+�
+�A�4�#�:��,�-��Q������<��A��D��%�D���L�G�3���S�V��$���Q����%�D���L�G�3�$�K�K��l�;�M�C�r��J�J��k�3�b�(�A�E�J�K��A���h�h�q�k����J�J��t�c�z�D�(�)��J�J��;��1�d�I�q�A�B�	�Q���1�%�2�Jr)N)�__doc__rrr
+rr�r�r��LAYER_BOUNDARY�IDENTITY�	ZERO_MARKr�r�r��rr	�<module>r�sj���*
+�	���0�
+=�"B��
+)�B��
+"�B�	�
+-�B�
+	�
+"�B�	�
+"�
+B�	�
+"�B�	�
+"�B�	�
+!�B�	�
+!�B�	�
+ �B�	�
+#�B�	�
+!�B�	�
+ �B�"	�
+$�#B�$	�
+%�%B�(	�
+)�)B�*	�
+)�+B�.	�
+,�/B�0	�
+5�1B�2	�
+5�3B�4	�
+(�5B�6	�
+)�7B�8	�
+&�9B�:	�
+&�;B�<	�
+&�=B�>	�
+(�?B�@	�
+&�AB�B	�
+'�CB�D	�
+%�EB�H	�
+$�IB�J	�
+(�KB�Z	�
+(�[B�\	�
+$�]B�^	�
+$�_B�`	�
+%�aB�b	�
+,�cB�d	�
+(�eB�f	�
+(�gB�h	�
++�iB�j	�
++�kB�l	�
+,�mB�n	�
+,�oB�p	�
+/�qB�r	�
+$�sB�t	�
+&�uB�v	�
+'�wB�x	�
+)�yB�z	�
+&�{B�~	�
+#�B�@	�
+#�AB�B	�
+$�CB��L,�.�.�+�/�1�.�+�(�
+
+��5������
+�	��"6�
+&r
\ No newline at end of file
Index: trunk/kernel/__pycache__/joint.cpython-313.pyc
===================================================================
trunk/kernel/__pycache__/joint.cpython-313.pyc
new file mode 100644
--- a/trunk/kernel/__pycache__/joint.cpython-313.pyc	(nonexistent)
+++ b/trunk/kernel/__pycache__/joint.cpython-313.pyc	(revision 2)
@@ -0,0 +1,89 @@
+�
+
+:�j���SrSSKrSSKrSSKr\RR\RR
+\55r0r	Sr
+"SS\5rg)uI接合秩。
+
+doc: joinrank matrix.reduce
+
+Common-Lang/1 定理 4.1。入力の分割 [n] = A ⊔ B と値の行列
+
+    F[α][β] = f(α, β)          α ∈ {0,1}^A,  β ∈ {0,1}^B
+
+に対し、F2 上の階数 ρ = rank F が
+
+    f(x_A, x_B) = ⊕_{r=1}^{ρ} p_r(x_A) q_r(x_B)
+
+の分離積の最小本数になる。ρ が「カットを渡る独立影響の本数」であり、
+分解が立つとき縮約行列はテンソル積へ割れる。
+
+    M_f = M_g (M_{h_A} ⊗ M_{h_B})
+
+階数は掃き出しで取らない。ピボットの選び方は文に現れない量になるので、⊕ 閉包の
+高さで取る(common_apps/joinrank/joinrank/rank.cmn)。
+
+    V_0 = {0},   V_{α+1} = V_α ∪ (V_α ⊕ R_α),   ρ = log2 |V|
+
+この module は表を語へ置いて image を実行し、出た語を読むだけになる。
+�Nc�b�U[;a[R"U5[U'[U$�N)�_B�lex�	addresses)�dics �//mnt/data/common_scope_notebook/kernel/joint.py�
+_addressesr
+$s$��
+�"�}��-�-��$��3��
+�c�7�N�c�8�\rSrSrSrS	SjrS	SjrSrSrSr	g)
+�Joint�*u0接合秩の image ひとつ。実行に要る語数は辞書の帯が決める。
+
+image は二本。`joinrank` が ρ と分離積、`anf` が正規形の台だけを返す。
+台は同心円の図(Common-Lang/2 定義 4.1)で p_r と q_r がどの単項式を読むかを
+引くために要る。
+Nc��[U5nUSUSsUlUlUSUSsUlUlUSUSUSsUlUlUlUSUS	US
+sUlUl	Ul
+USUlUSUS
+sUlUl
+USS-S-Ul[R "[R""[%US5R'555SUlSUlU(aK[R "[R""[%US5R'555SUlgg)N�pebobe�pebobo�pebopa�pebopi�pebopu�pebopo�pepabe�pepube�pepupu�pepupe�pobepu�pebebo�pebepai@i�rb�)r
+�NIN�KUT�NAA�NBB�RHO�NVT�OVF�TAB�WIT�PCO�ANF�RHOMAX�STRIDE�words�vcpu�	translate�decode�open�read�tab�anf_tab)�self�
+image_path�dic_path�anf_path�as     r	�__init__�Joint.__init__2s$���x� ���x�[�!�H�+����$�(��x�[�!�H�+����$�(�'(��{�A�h�K��8��$���$�(�D�H�'(��{�A�h�K��8��$���$�(�D�H��X�;���#$�X�;��(�� ���T�[��x�[�G�,�v�5��
+��>�>�$�+�+�d�:�t�.D�.I�.I�.K�"L�M�a�P��������>�>�$�+�+�d�8�T�6J�6O�6O�6Q�*R�S�TU�V�D�L�rc�|�[R"UR5nX5RUR'UbXERUR
+'[
+U5H*upgU(dMSURURU-'M, [R"X5S:wa[S5eUR$)Nrru$接合秩の文が失敗しました)
+r-�Laner,�Mrr �	enumerater&�run_lane�
+ValueError)r4r2�table�n�cut�lane�v�bs        r	�_run�
+Joint._run@s����y�y����$�����t�x�x���?�"�F�F�4�8�8���e�$�D�A��q�'(����t�x�x�!�|�$�%��=�=��#�q�(��C�D�D��v�v�
+rc���URc/$URURX5n[SU-5Vs/sHoCURU-(dMUPM sn$s snf)uF正規形の台。a_T = ⊕_{R⊆T} f(R)(R1 のメビウス変換)r)r3rG�ranger))r4rArBr=�ts     r	�support�
+Joint.supportLsQ���<�<���I��I�I�d�l�l�E�-�� ��a��=�<�=�a�d�h�h��l�O��=�<�<��<s�A#�A#c��URURXU5nX@R(a[SURS-
+-5eX@R
+X@RX@Rpvn[U5VV	s/sH>n[U5V	s/sH$o�URURU--U	-PM& sn	PM@ n
+nn	[U5VVs/sH>n[U5Vs/sH$o�URURU--U-PM& snPM@ nnnX#X\U
+[SU-5V
+s/sHo�URU
+-(dMU
+PM sn
+S.n[U5Vs/sHo�RX�U5PM snUS'[U5VVs/sH+o�RX�X#-
+5Vs/sHo�U-PM	 snPM- snnUS'U$s sn	fs sn	nfs snfs snnfs sn
+fs snfs snfs snnf)u�頂点値の表とカットから ρ、分離積、そして図に要る台を返す。
+
+psup[r] は p_r の台。添字はそのまま [n] の番号になる。
+qsup[r] は q_r の台。B 側の番号なので κ だけ左へずらす。
+u(接合秩が語の容量 %d を越えたr)rBrC�rho�p�q�anf�psup�qsup)rGr2r%r@r*r#r!r"rJr'r+r(r)rL)r4rArBrCr=rO�na�nb�rrFrQ�xrPrK�out�ss                r	�__call__�Joint.__call__Ss���
+�I�I�d�h�h��#�.���X�X�;��G�4�;�;�YZ�?�[�\�\����k�1�X�X�;��(�(����MR�SV�Z�X�Z���r��
+C��A����4�;�;��?�*�Q�.�/��
+C�Z��X�MR�SV�Z�X�Z���r��
+C��A����4�;�;��?�*�Q�.�/��
+C�Z��X��#�A�"'��Q��-�C�-�Q�T�X�X��\�?�q�-�C�E��8=�c�
+�C�
+�1�|�|�A�D�#�.�
+�C��F��PU�VY�PZ�[�PZ�1�,�,�q�t�Q�W�*E�F�*E�Q�S��*E�F�PZ�[��F���
+��
+D��X��
+C��X��C��C��F��[sZ�G�+G�G�G&�,+G!�G&�4G,�G,�*G1�G;�8G6�G;�G�!G&�6G;)r)r r!r"rr$r%r(r#r*r+r&r'r3r2r,r)
+�__name__�
+__module__�__qualname__�__firstlineno__�__doc__r9rGrLr[�__static_attributes__�rr	r
+r
+*s���W�
+�=�rr
+)
+ra�osrr-�path�dirname�abspath�__file__�_HERErr
+�objectr
+rcrr	�<module>rksJ���2
+�
+��
+�����������1�2�����9�F�9r
\ No newline at end of file
Index: trunk/kernel/__pycache__/scope.cpython-313.pyc
===================================================================
trunk/kernel/__pycache__/scope.cpython-313.pyc
new file mode 100644
--- a/trunk/kernel/__pycache__/scope.cpython-313.pyc	(nonexistent)
+++ b/trunk/kernel/__pycache__/scope.cpython-313.pyc	(revision 2)
@@ -0,0 +1,222 @@
+�
+
+���j2�
+��SrSSKrSSSSSSS	S
+SS.	rS
+S
+SS
+SS
+S
+S.rSrSrSKSjrSrSrSr	Sr
+SKSjrSrSr
+SrSr0SS_SS_SS_S S_S!S_S"S_S#S_S$S%_S&S%_S'S%_S(S%_S)S%_S*S+_S,S+_S-S+_S.S+_S/S+_0S0S+_S1S+_S2S+_S3S+_S4S5_S6S5_S7S5_S8S5_S9S5_S:S5_S;S5_S<S=_S>S=_S?S=_S@S=_SAS=_SBSC_ESCSCSCS=SD.ErSESFSGSH.rSKSIjrSJrg)Lu#commonc の作業領域を画面の形へ写す。
+
+doc: commonc.alloc commonc.stages plain.tensor casm.lane64.block
+
+compile が終わった lane には、commonc が自分で組んだ表がそのまま残っている
+(19 §3.2)。この module はその表を読むだけで、計算を足さない。
+
+    語 4    B        配列の刻み
+    語 5    n_syl    音節の数
+    語 6    n_box    箱の数
+    語 132  BODY     本文の最初の音節番号。手前は採用語彙の表
+    SYL   1B         音節番号
+    OPK   4B         種類  1 Cst 2 Add 3 Mul 4 Neg 5 Store 6 Ok 7 Load 8 EqBr 9 LtBr
+    OPA   6B         第一引数の箱番号(Cst では分子)
+    OPB   8B         第二引数の箱番号
+    OPD  10B         深度 δ
+    OPL  12B         分岐先の箱番号
+
+覆いは λ(w) = 語 64 + w(19 式 6.1)なので、実行した後の語 64+w が箱 w の分子になる。
+分子と深度の対で二進有理数が決まる。
+
+    値(w) = OPA・OPB から組んだ分子 / 2^OPD[w]                    01 §1
+�N�Cst�Add�Mul�Neg�Store�Ok�Load�EqBr�LtBr)	���������	)TT)TF)r
+rrrrrr�@c���USnUSUSp2UUUUSUSXX-USU-SU-U-USU-SU-U-USU-SU-U-USU-SU-U-USU-SU-U-S	.$)
+u5commonc の表を切り出す。返りは辞書一つrrrr�r�
+�)�B�nSyl�nBox�nNeed�body�syl�opk�opa�opb�opd�opl�)�Mr�n_syl�n_boxs    �//mnt/data/common_scope_notebook/kernel/scope.py�arraysr*&s���	�!��A��Q�4��1��5�
+����1���#���1�9�~���Q��q�1�u�u�}�%���Q��q�1�u�u�}�%���Q��q�1�u�u�}�%���a���Q����'���a���Q����'���c���[R"USUSSU5n/SSpTnUH2upgp�p�nUS:Xa	US-
+nSnMURXgX�X�XES.5 US-
+nM4 U$)uZ本文の音節を語へ切り、層番号と位置を付ける。表の区間は落とすrrNr�kar)r�sym�pin�pout�boxes�cls�r�q)�
+generators�read�append)
+�a�lexiconr�outr3r4�spelling�symbolr/r0r1�layer�_ns
+             r)�wordsr?Bs����?�?�1�U�8�A�f�I�J�/��9�D��A�q�A�C�9=�5��#�U�2��t��
+��F�A��A���
+�
+�8�3�"�q�B�	C�	�Q���:>��Jr+c��/SSpCn/n[R"[R"U5U5H4upgp�p�nUS:Xa[X%X45up#n/nM!UR	XhX�45 M6 [X%X45up#nU[U5U4$)uS文ひとつの (pin, pout, 箱の本数)。table は先に畳んだ見出しの表rr-)r5r6�stream�_fold_layerr7�len)
+�text�table�front�borrowedr1r=r;�_symr/r0�bx�_clsr>s
+             r)�foldrKZs�����A�U�E��E�3=�?�?����d�#�U�4,�/���2�R��t��%0��x�%O�"�E�U��E��
+���h�T�.�/�
+4,�)��x�G��E�U��S��Z��&�&r+c��S/pTUHwupgp�U	cSnOUbX9-
+nUS:XaSOUn
+[U
+5H;nU[U5:�aUS/-nUS-
+nUS:XaURX5 US-
+nM= US:wdMoXV/U--
+nMy XPUS-X#4$)Nr�kiruΓ⁻)�rangerCr7)rFr=rGr1�curr:r;r/r0rI�take�_s            r)rBrBis����"��#(���t�
+�:��E�
+�
+��K�E���$�q�#���t��A��c�%�j� ���	�)���A�
+���4���
+�
+�5�:�&��1�H�C�
+��t���:��$�$�C�$)��s�t���h�-�-r+c�h�0nUHup#n[XA5X'M U$![a SX'M+f=f)uF`.dic` の行を順に畳む。後の行は前の見出しを引ける)rrN)rK�
+ValueError)�entriesrEr>�namers     r)r9r9}sE���E�!���$�	'��t�+�E�K�"�
+�L���	'�&�E�K�	'�s�
+�1�1c�(�//p![[SU5SS9S-5GHgnUVs/sHoDSU:XdM
+UPM nnU(dM)S//p�nUH�nUSS:XaZU[U5:aURX&5 URSXfS-/[U5S-
+[U5/S	S
+.5 US-
+nMf[U5n	XtS/US--
+nURUSUSXfUS
+-/X�US-/SS.5 XdS
+-
+nM� X&Sn
+[[U
+55HAnURX�Xk-Xk-S-/[U5U-[U5U-S-/S	S
+.5 MC URU[	U5Xz-US.5 Xz-nGMj U$s snf)u層ごとの机と、箱が机のどこを取ってどこへ置いたか。
+
+返りの一行は
+
+    r      層番号
+    in     入口の机。欄は語の綴り
+    out    出口の机
+    put    [{syl, take, give, at}]  take は入口の区間、give は出口の区間
+c3�*# �UH	oSv� M g7f)r3Nr%)�.0�ws  r)�	<genexpr>�frontier.<locals>.<genexpr>�s���+��1�#���s������)�defaultrr3rrrMT)rrP�give�wirer0r2r/F)rr2rPr^r_N)r3�inr:�put)rN�maxrCr7�list)�ws�rowsrFr3rYr=rOr:ra�at�rest�ks            r)�frontierri�s����b�%�
+�3�+��+�R�8�1�<�
+=���.�B�q�C�&�A�+��B��.����2�r�#���A���x�4����U��#��J�J�u�z�*��
+�
+�4�#�Q�w��%(��X��\�3�s�8�$<�d�L�M��q�����S��B��e�H�:��&�	�)�)�C��J�J�q��x��%��!$�A�e�H�n� 5�!#�!�F�)�^� 4�e�E�
+F�
+�U�8�O�C���T�{���s�4�y�!�A��J�J�t�w���#�'�A�+�0F�!$�S��A��s�3�x�!�|�a�/?� @�$�P�
+Q�"�	
+���!�4��;�s�z�#�N�O��
+��1>�2�K��1/s
+�F�Fc
+���USUSUSUSUS4up#pEn/n[US5H�nX(n	[RU	S5up�U[RU	[	U	55XXX8U
+4XHU44VV
+s/sHup�U
+(dMUPM sn
+nS.nU	S	:XaX8US
+'U	S;aXhUS'Ub%[
+U-[
+U5:aU[
+U-US
+'URU5 M� U$s sn
+nf)u�箱を節点、OPA と OPB を辺として並べる。
+
+wire は実行した後の作業領域。渡すと語 64+w を分子として添える。
+r r!r"r#r$r)FF)�i�kind�dr`r�num)rr�to�v)rN�EDGES�get�KIND�str�	WIRE_BASErCr7)r8r_r r!r"r#r$r:rkrh�ua�ub�x�use�nodes               r)r1r1�s
+��
+ ��h��%��!�E�(�A�e�H�a��h�N��C�c��
+�C�
+�1�V�9�
+���F�����1�n�-��������C��F� 3�#�&�),����s�v�r�l�'C�K�'C�V�Q�s�q�'C�K�M����6��&�D��K���;���D��J���	�A�
+��D�	� 9��Y��]�+�D��I��
+�
+�4����J��Ls�;
+C1�C1c��USUSp!USS-
+n/nUS:�a^XS;aVXS:Xa9XUS:Xa.X"U[:aURX"UUSUS	.5 US-nUS:�a
+XS;aMV[US
+S9$)u^出口境界 Γ⁺。末尾の Cst と Store の連なりが語 0.. を埋める(19 §2.1)r r!rrr)rrrrr")�word�boxc��US$)Nr|r%)rxs r)�<lambda>�gamma.<locals>.<lambda>�s��Q�v�Yr+)�key)rur7�sorted)r8r r!rkr:s     r)�gammar��s�����x��5���	�&�	�A�
+�A�
+�C�
+�q�&�S�V�y�(��6�Q�;�3�1�v�;�!�+���F��i�0G��J�J���F��A�e�H�Q�K�@�A�	�Q����q�&�S�V�y�(��#�.�/�/r+c��S/p2UH0nUScSS/S.s $URX"US-/5 X$S-
+nM2 USU-
+nUS:aSS/S.$SX2US/S	.$)
+u8語と箱を並べて突き合わせる。
+
+生成元ごとに開く箱の本数は 16 §5 の表で決まる。読みの順に数えて合えば、
+画面の語と DAG の節点が一対一で結べる。判定値 Q の語は本数が固定でないので、
+その場合は結ばずに ok = False を返す。
+rr1Fu*箱の本数が固定でない語がある)�ok�why�spansru!箱が語の総和に足りないT)r�r��tail)r7)rdr8�nr�rYr�s      r)�alignr��s����"�u�
+���W�:���(T�_a�b�b�
+���a�Q�w�Z��(�)�	�w�Z���	�
+
+�V�9�q�=�D��a�x��$G�RT�U�U���A�f�I��?�?r+c���URU5nURU5up4n/nUHgupxp�URX(5nURU[	U5U	bUR
+X)SOSUVs/sHn[	U5PM snS.5 Mi 0n
+UH:nU
+R
+UR
+USS5S-X�R
+US'M< [	U5[	U5XmS.$s snf)uMblock への分け方(式 7.4)と、block の中の層(式 7.1、7.2)ru	落ちる)�pcr��term�layersr)�bytes�insns�blocks�kinds)�decoder�r�r7rC�NAMErr)�vcpu�img�prog�_ent�_idx�blr:r�rr��_stop�layrxr��inss               r)�imager��s����;�;�s��D��[�[��&�N�D��
+�C�!#���$��k�k�$�%���
+�
+�"�3�t�9�8<�8H�D�I�I�d�j��m�4�k�/2�3�s�!�s�1�v�s�3�5�	6�"$�
+
+�E���#(�9�9�T�Y�Y�s�1�v�->��#B�Q�#F��i�i��A��� ����X��D�	�S�Q�Q��	4s�3C/c��US:�a$US-S:XaUS-nUS-nUS:�aUS-S:XaMSU-nXU(aX-S.$SS.$)u9x/2^δ を約分して (分子, 分母, 十進) にするrr
+rg)rn�den�decr%)rnrmr�s   r)�dyadr�sZ��
+�a�%�C�!�G�q�L���	��	�Q����a�%�C�!�G�q�L��q�&�C���3�9�E�E��E�Er+�hur��no�ha�ti�se�mi�mo�hi�bit�so�ne�ra�goro�judge�nu�yu�ye�yo�ri�ru�na�ni�re�trace�sa�si�ke�su�ro�wa�wi�point�ko�ta�de�do�wu�
+reflection)�we�wo�ga�giu数u判定u判定値 𝒬)r�r�r�c�X�[R"U5n//pT[R"X!=(d 05H=upgp�p�nUS:Xa[XE5up�U
+(aU
+s $/nM*UR
+XhU	45 M? [XE5up�U
+$![an[U5sSnA$SnAff=f)ub平文を読む前に見る。直す場所が分かる文言を返す。問題が無ければ NoneNr-)r5rArSrtr6�_check_layerr7)rDrEr�erFr=r;rHr/r0�_bxrJr>�msg�_fronts               r)�checkr�'s��������%���r�5�4>�O�O�C��RT�4U�0���3�b��t��%�e�3�J�C���
+��E��
+���h�T�*�+�5V��u�,�K�C��J�����1�v�
+���s�B
+�
+
+B)�
+B$�B)�$B)c���S/p2UH�upEnUS:XaSOUn/n[U5H6n	U[U5:�aSXG4-U4s s $URX5 US-
+nM8 US:Xa+[U5S:XaUSS;aS[US-U4s $US	:XaU(aUSS
+:XaSU4s $US:XaX8-
+nM�U[RUS5/U--
+nM� SX0US-4$)NrrMru�机に置いた物が足りない。「%s」は %d つ取るが、机にはそれだけ無い。平文は空の机から始まるので、足りない分は hu で立てる�mur
+)r�r�ui%s を語へ書けない。mu が取る値は数でなければならない。mo を挟んで数へ戻す�yir�uyΩ の閉じ yi は判定を取る。いま机の上にあるのは数なので、hi などの判定をそのまま渡す)rNrCr7�
+_TYPE_NAME�_CLASSrr)
+rFr=rOr:r;r/r0rP�gotrQs
+          r)r�r�;s2���"��$���t���$�q�#�����t��A��c�%�j� �g�jr�iy�z�}B�B�B��J�J�u�z�"��1�H�C���t���C��A�
+�#�a�&�<L�2L�2�4>�s�1�v�4F�G�IN�O�
+O��t����A��&�(8�>�@E�F�
+F��t���J�C��F�J�J�x��.�/�$�6�6�C�% %�&��S�T�{�"�"�"r+)N)�__doc__r5rsrqrur*r?rKrBr9rir1r�r�r�r�r�r�r�r�r%r+r)�<module>r�sE���0��U�u��7��F�v�&�2��
+�\�m��]�|��	N��
+�	��8�0'�.�(�&$�R�,	0�@�*
+R�$F�*
+��&�
+���
+� $�f�
+�.2�F�
+�<@�&�
+��&�
+���
+�	�%�
+��u�
+�#�E�
+�,0��
+�9=�e�
+�	�'�	
+���	
+�#'��	
+�26�w�	
+�AE�g�	
+�
+	�'�
+�
+��
+�
+#'��
+�
+26�w�
+�	�'�
+
+���
+
+�#'��
+
+�26�w�
+
+�	�'�
+���
+�#'��
+�	�'�
+���
+�#'��
+�26�w�
+�AE�g�
+�	�,�
+�+�,�l�
+�
+���H�7G�
+H�
+��(#r+
\ No newline at end of file
Index: trunk/kernel/__pycache__/session.cpython-313.pyc
===================================================================
trunk/kernel/__pycache__/session.cpython-313.pyc
new file mode 100644
--- a/trunk/kernel/__pycache__/session.cpython-313.pyc	(nonexistent)
+++ b/trunk/kernel/__pycache__/session.cpython-313.pyc	(revision 2)
@@ -0,0 +1,90 @@
+�
+
+���jW����SrSSKrSSKrSSKrSSKrSSKr\RR\RR\	55r
+\
+\R;a\RRS\
+5 SSKrSSK
+r
+SSKr\
+Rr\S-rSr"SS\5rSr\RR+\R,"5S5rS	rSS
+jrS\\4SjrSS\\4Sjr\\S4S
+jrg)u[セル一つを compile して実行し、scope を組む。
+
+doc: commonc.pipeline casm.lane64.host plain.format
+
+道は一本になる(19 §7.1)。
+
+    .dic + .cmn ──(commonc_lane64.bin on lane64)──▶ lane64 image ──(lane64)──▶ M
+
+compile の受け渡しは toolchain.compile と同じだが、入口が path ではなく文字列で、
+commonc の作業領域を捨てずに返す。scope はその作業領域から組む。
+
+CPython でも Pyodide でも同じ code が動く。違うのは commonc の image の場所だけで、
+それは start() の引数で決まる。
+�Ni ic��\rSrSrSrg)�	CellError�%�N)�__name__�
+__module__�__qualname__�__firstlineno__�__static_attributes__r��1/mnt/data/common_scope_notebook/kernel/session.pyrr%s��rrc��U[lg)uccommonc の image の場所を決める。翻訳は最初の compile のときに一度だけ行うN)�	toolchain�COMMONC)�commoncs r
+�startr)s
+���I�rzcommon_scope_cell.dicc�L�[[SSSS9RU5 [$)uG採用語彙の表を lex へ渡すために一度だけ file にする�w�utf-8�
+)�encoding�newline)�open�_DIC�write)�texts r
+�	_dic_filer;s ����s�W�d�3�9�9�$�?��Krc��S[U5S-0pCnU(avUR5(aa[U5n[R"U5n[R
+"XP5n[R"[R"U55nX -RS5n[U5n[US-SSU-S-5n[RU-n	[R"X�-S-5n
+U
+R[U5U	5 X�R [R"'[URS55U
+R [R$'[R&"[R("5U
+5nUS:wa6[R*"X5nU(a[-U5e[-SU-5eU
+R SU
+R SU
+R S	p�n
+U
+(aU(d[-S
+5eU[.:�a[-SU[.4-5e[1SU
+R X�U-55X�R 4$)
+uN平文を image にする。返りは (image, n_need, commonc の作業領域)��r�Piruqcommonc がこの文を読めない(報告 %s)。音節表の外の綴りか、机の上が合っていない��u!commonc が image を出さないuJ箱が多すぎてワイヤが作業領域に重なる(n_need %d > %d)c3�*# �UH	oS-v� M g7f)��Nr)�.0�vs  r
+�	<genexpr>�compile_text.<locals>.<genexpr>bs���;�":�Q�S��":�s�)�len�stripr�lex�lexicon�expanded_syllables�scope�entries�encode�maxr�IN_MUL�vcpu�Lane�	put_input�list�M�W_B�W_LEXB�run_lane�_commonc�checkr�WORK�bytes)�source�dic�table�est�fold�path�data�n�b�base�lane�rep�hit�imgb�nimg�needs                r
+�compile_textrPAs����3�v�;�!�+�R��E�
+�s�y�y�{�{���~�����D�!���$�$�T�2���}�}�S�[�[��.�/��
+�N�"�"�7�+�D��D�	�A��A��F�D�!�c�'�B�,�'�A����a��D��9�9�T�X��_�%�D��N�N�4��:�t�$��F�F�9�=�=��"�5�<�<��#8�9�D�F�F�9����
+�-�-�	�*�*�,�d�
+3�C�
+�a�x��k�k�&�'����C�.� ��W�Y\�]�^�	^��v�v�a�y�$�&�&��)�T�V�V�A�Y��D��T��;�<�<��d�{��d�hl�nr�gs�s�t�t��;�$�&�&��T�k�":�;�;�T�6�6�I�Irc��[R"[R"U55Sn[R"U5nU=(d 0R	5H&upg[U5UR[U5'M( [R"XEUS9nX�4$![a [SU-5e[a [SU-5ef=f)Nr"��budgetuXblock を %d 回辿っても終わりません。Ω の「もう良いか」を見直すuR語番号が作業領域を越えた(語数 %d)。セルの words を増やす)r4�	translate�decoder5�items�intr8r;�RuntimeErrorr�
+IndexError)	�image�seeds�wordsrS�tabrJ�kr'rKs	         r
+�	run_imager_js���
+�.�.����U�+�
+,�Q�
+/�C��9�9�U��D���"�#�#�%����Q�����s�1�v��&�v��m�m�C�f�5��
+�9���	�}��r�u{�{�|�|��v��l�ot�t�u�u�v�s�B � 0Cc�.�[X5upVn[XRX45up�U(aCUR5(a.[R"[
+R"[55O0n
+[R"U5n[R"X�5n[R"X�R5n
+[R"U5nUVs0sHo�SUSUS_M nnSUUUSUS-
+USU[U5S.[R"U5R!5S	S
+U[R""U5U
+[R$"X�5UVs/sH:n['U40[R("U	RUSUUS5D6PM< sn[R*"[,U5[/S5Vs/sHnU	RUPM sn[1U	R25R5S5S
+.
+$s snfs snfs snf)u8セル一つ。compile して実行し、scope を返す�word�opd�boxT�nSyl�body�nBox)�sylrcrOrZN��@zlatin-1)
+�ok�reportr@�size�markr\�frontier�boxes�align�gammarZ�out�put)rPr_r+r/r-r,r0r�arraysr\ror8rqr*�hashlib�sha256�	hexdigestrnrp�dict�dyadrZr4�ranger?�OUTrU)r@rAr[r\rSrZrO�cmrKrJrB�a�ws�bx�gm�g�depthr^s                  r
+�cellr�xs���"�6�/�O�E���%��6�I�C�14������E�M�M�#�+�+�d�+�,�2�E�
+���R��A�	���Q�	�B�	���Q���	�B�	���Q��B�46�7�B�q�v�Y��%���5��*�
+*�B�E�7�����&�	�A�f�I�-�a��i���E�
+�4����u�%�/�/�1�#�2�6���N�N�2�&�����R�#����a��q�L�E�J�J�t�v�v�a��i�'8�%��&�	�:J�K�L������T�5�)�#(��9�-�9�a����q�	�9�-��T�X�X��%�%�i�0�!���
+8����.s�H�AH
+�Hc���[U5nUS:�a[SU-5e[R"[R"U55Sn/n[SU-5H�n[R"U5n	[U5H"up�X�-	S-U	R[U5'M$ [R"XiUS9 URU	RU(aSOS5 M� U$)uV入力の語へ {0,1}^n を全部当て、語 out の値を頂点値として並べる�u@入口が %d 本。頂点は 2^n なので 12 本までにするr"rRr)r*rr4rTrUrzr5�	enumerater8rWr;�append)rZ�inputsr\rSrrrGr]�tblr'rJr^rs            r
+�verticesr��s����F��A��2�v��Z�]^�^�_�_�
+�.�.����U�+�
+,�Q�
+/�C�
+�C�
+�1��6�]���y�y�����f�%�D�A��f��\�D�F�F�3�q�6�N�&��
+�
+�c��/��
+�
+����s��1��+���Jr)N)�__doc__ru�os�sys�tempfiler/rE�dirname�abspath�__file__�_HERE�insertr,rr4r>�
+DEFAULT_WORDS�DEFAULT_BUDGET�	Exceptionrr�join�
+gettempdirrrrPr_r�r�rrr
+�<module>r�s���
+��	�
+���
+�����������1�2��������H�H�O�O�A�u��
+����~�~���� �
+���	�	�	� �
+�w�w�|�|�H�'�'�)�+B�C���!J�R �}�^����]�>��N#0��A�
+r
\ No newline at end of file
Index: trunk/kernel/generators.py
===================================================================
trunk/kernel/generators.py
new file mode 100644
--- a/trunk/kernel/generators.py	(nonexistent)
+++ b/trunk/kernel/generators.py	(revision 2)
@@ -0,0 +1,198 @@
+# -*- coding: utf-8 -*-
+"""音節と生成元の対応表。
+
+doc: plain.format commonc.generators casm.generators
+
+音節番号は生成順で決まる(19 式 2.1)。
+
+    idx(cv) = 5 ord(c) + ord(v)
+    C = (k s t n h m y r w g z d b p),  V = (a i u e o)
+
+commonc の SYL 配列(19 §3.2)はこの番号をそのまま並べる。表はそこから引く。
+
+範囲は三つに分かれる。
+
+    idx <= 59      一音節の生成元
+    idx 60..69     見出しの字母 Σ_V = {be bo pa pi pu pe po}(06 §17)
+    ku + 二音節    三音節の生成元。領域の語(region.cam)
+
+pin と pout は境界語を一段動かす幅(13 式 1.2)。boxes は Desc が開く MBox の本数
+(16 §5)で、0 の語は実行費用を持たない。
+"""
+
+CONSONANT = "kstnhmyrwgzdbp"
+VOWEL = "aiueo"
+
+
+def name(idx):
+    """音節番号から綴りを返す"""
+    return CONSONANT[idx // 5] + VOWEL[idx % 5]
+
+
+def index(syl):
+    """綴りから音節番号を返す"""
+    return 5 * CONSONANT.index(syl[0]) + VOWEL.index(syl[1])
+
+
+# 欄は (記号, pin, pout, 開く箱の本数, 層) になる。
+#
+# 層は画面の色分けにだけ使う。
+#   frame   文の区切り。層境界と無声ワイヤ
+#   dyad    二進有理数 Z[1/2] の上の演算
+#   bit     二値
+#   store   作業領域
+#   omega   閉包 Ω_a
+#   judge   判定値 Q。非可換 quantale(GCLS 定理 3.3)
+#   region  幾何の領域と鎖
+#   report  報告
+#   letter  見出しの字母
+ATOM = {
+    "ka": ("層境界", 0, 0, 0, "frame"),
+    "ki": ("id", 1, 1, 0, "frame"),
+    "ku": ("零標示 z_e", 0, 0, 0, "frame"),
+
+    "hu": ("one", 0, 1, 1, "dyad"),
+    "no": ("⊕", 2, 1, 1, "dyad"),
+    "ha": ("⊖", 1, 1, 1, "dyad"),
+    "ti": ("⋆", 2, 1, 1, "dyad"),
+    "se": ("β", 1, 1, 4, "dyad"),
+    "he": ("Δ", 1, 2, 0, "dyad"),
+    "ho": ("!", 1, 0, 0, "dyad"),
+
+    "so": ("φ∂", 1, 1, 8, "bit"),
+    "hi": ("≤", 2, 1, 8, "bit"),
+    "mo": ("π", 1, 1, 0, "bit"),
+
+    "mi": ("Load", 1, 1, 1, "store"),
+    "mu": ("Store", 2, 0, 1, "store"),
+
+    "ya": ("Ω 開き", 0, 0, 0, "omega"),
+    "yi": ("Ω 閉じ", 1, 0, 1, "omega"),
+
+    "to": ("整合対", 2, 1, None, "judge"),
+    "na": ("原型 1 と整合", 1, 1, None, "judge"),
+    "ni": ("原型 0 と整合", 1, 1, None, "judge"),
+    "nu": ("⋆_Q", 2, 1, None, "judge"),
+    "ne": ("所属", 1, 1, None, "judge"),
+    "yu": ("⋁", 2, 1, None, "judge"),
+    "ye": ("↘", 2, 1, None, "judge"),
+    "yo": ("↙", 2, 1, None, "judge"),
+    "ra": ("≤_Q", 2, 1, None, "judge"),
+    "ri": ("hom", 2, 1, None, "judge"),
+    "ru": ("π_Q", 1, 1, None, "judge"),
+    "go": ("Θ", 1, 1, None, "judge"),
+
+    "bi": ("∂", 1, 1, 0, "region"),
+    "bu": ("⊕ 鎖", 2, 1, 0, "region"),
+
+    # ツイ数平面。型名 T/P/R はそれぞれ複数の lane64 語で表す。
+    #   Trace T      = 4 語
+    #   Point P      = 2 語
+    #   Reflection R = 1 語
+    # pin/pout は抽象オブジェクトの個数ではなく、この境界語の本数になる。
+    # 箱数は commonc の正規化で生成元単位に固定できないため None とする。
+    "re": ("trace", 0, 4, None, "plane"),
+    "sa": ("i", 4, 4, None, "plane"),
+    "si": ("j", 4, 4, None, "plane"),
+    "ke": ("id", 4, 4, None, "plane"),
+    "su": ("⊖ trace", 4, 4, None, "plane"),
+    "ro": ("ρ⁻", 4, 4, None, "plane"),
+    "wa": ("ρ⁺", 4, 4, None, "plane"),
+    "wi": ("endpoint", 4, 2, None, "plane"),
+    "ko": ("id coord", 2, 2, None, "plane"),
+    "ta": ("⊕ coord", 4, 2, None, "plane"),
+    "de": ("実成分", 2, 2, None, "plane"),
+    "do": ("無限成分", 2, 2, None, "plane"),
+    "wu": ("E", 0, 1, None, "plane"),
+    "we": ("R_r", 0, 1, None, "plane"),
+    "wo": ("R_ij", 0, 1, None, "plane"),
+    "ga": ("合成", 2, 1, None, "plane"),
+    "gi": ("act", 3, 2, None, "plane"),
+
+    "me": ("Ok", 0, 0, 1, "report"),
+    "di": ("Ko", 0, 0, 1, "report"),
+    "du": ("Put", 1, 0, 1, "report"),
+}
+
+# ku を頭に置く三音節の生成元(region.cam)
+TRIPLE = {
+    "kukeke": ("領域", 1, 1, 0, "region"),
+    "kukeko": ("共通部", 2, 1, 0, "region"),
+    "kukesa": ("合わせ", 2, 1, 0, "region"),
+    "kukesi": ("外側", 2, 1, 0, "region"),
+    "kukesu": ("境界 ∂", 1, 1, 0, "region"),
+    "kukese": ("含まれる", 2, 1, 1, "region"),
+    "kukeso": ("重なり", 2, 1, 1, "region"),
+    "kuketa": ("隣接", 2, 1, 1, "region"),
+    "kuketi": ("道", 1, 1, 1, "region"),
+}
+
+# 見出しの字母(06 §17)。採用語彙の名前だけに使い、生成元ではない
+LETTERS = ("be", "bo", "pa", "pi", "pu", "pe", "po")
+
+LAYER_BOUNDARY = 0          # ka
+IDENTITY = 1                # ki
+ZERO_MARK = 2               # ku
+
+
+def stream(text):
+    """filter_Σ(16 §1.1、19 式 4.1)。音節表の外の字を落として番号の列にする。
+
+    ASCII 小文字が音節へ切れない所は誤りになる。
+    """
+    keep = [c for c in text if "a" <= c <= "z"]
+    if len(keep) % 2:
+        raise ValueError("音節の途中で切れている: ...%s" % "".join(keep[-5:]))
+    out = []
+    for k in range(0, len(keep), 2):
+        c, v = keep[k], keep[k + 1]
+        if c not in CONSONANT or v not in VOWEL:
+            raise ValueError("音節表に無い綴り: %s%s" % (c, v))
+        out.append(5 * CONSONANT.index(c) + VOWEL.index(v))
+    return out
+
+
+def look(spelling):
+    """綴りから (記号, pin, pout, 箱, 層) を返す。表に無い綴りは None"""
+    return TRIPLE.get(spelling) or ATOM.get(spelling)
+
+
+def read(syl, lexicon=None):
+    """SYL の番号列を語へ切る。返りは (綴り, 記号, pin, pout, 箱, 層, 長さ)。
+
+    ku で始まる三音節は一語にまとめる。見出しの字母が続く区間も一語にまとめる
+    ので、採用語彙の見出しがそのまま画面に出る。
+
+    lexicon は {見出し: (pin, pout, 箱)}。見出しは文を差し込む(16 式 1.6)ので、
+    境界の幅は差し込む文が決める。渡さないと幅 0 として置く。
+    """
+    lexicon = lexicon or {}
+    out = []
+    i = 0
+    n = len(syl)
+    while i < n:
+        s = name(syl[i])
+        if s == "ku" and i + 2 < n:
+            t = s + name(syl[i + 1]) + name(syl[i + 2])
+            hit = TRIPLE.get(t)
+            if hit:
+                out.append((t,) + hit + (3,))
+                i += 3
+                continue
+        if s in LETTERS:
+            j = i
+            word = ""
+            while j < n and name(syl[j]) in LETTERS:
+                word += name(syl[j])
+                j += 1
+            pin, pout, bx = lexicon.get(word, (0, 0, None))
+            out.append((word, "見出し", pin, pout, bx, "letter", j - i))
+            i = j
+            continue
+        hit = ATOM.get(s)
+        if hit:
+            out.append((s,) + hit + (1,))
+        else:
+            out.append((s, "未登録", 0, 0, None, "unknown", 1))
+        i += 1
+    return out
Index: trunk/kernel/joint.py
===================================================================
trunk/kernel/joint.py
new file mode 100644
--- a/trunk/kernel/joint.py	(nonexistent)
+++ b/trunk/kernel/joint.py	(revision 2)
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+"""接合秩。
+
+doc: joinrank matrix.reduce
+
+Common-Lang/1 定理 4.1。入力の分割 [n] = A ⊔ B と値の行列
+
+    F[α][β] = f(α, β)          α ∈ {0,1}^A,  β ∈ {0,1}^B
+
+に対し、F2 上の階数 ρ = rank F が
+
+    f(x_A, x_B) = ⊕_{r=1}^{ρ} p_r(x_A) q_r(x_B)
+
+の分離積の最小本数になる。ρ が「カットを渡る独立影響の本数」であり、
+分解が立つとき縮約行列はテンソル積へ割れる。
+
+    M_f = M_g (M_{h_A} ⊗ M_{h_B})
+
+階数は掃き出しで取らない。ピボットの選び方は文に現れない量になるので、⊕ 閉包の
+高さで取る(common_apps/joinrank/joinrank/rank.cmn)。
+
+    V_0 = {0},   V_{α+1} = V_α ∪ (V_α ⊕ R_α),   ρ = log2 |V|
+
+この module は表を語へ置いて image を実行し、出た語を読むだけになる。
+"""
+
+import os
+
+import lex
+import vcpu
+
+_HERE = os.path.dirname(os.path.abspath(__file__))
+_B = {}
+
+
+def _addresses(dic):
+    if dic not in _B:
+        _B[dic] = lex.addresses(dic)
+    return _B[dic]
+
+
+class Joint(object):
+    """接合秩の image ひとつ。実行に要る語数は辞書の帯が決める。
+
+    image は二本。`joinrank` が ρ と分離積、`anf` が正規形の台だけを返す。
+    台は同心円の図(Common-Lang/2 定義 4.1)で p_r と q_r がどの単項式を読むかを
+    引くために要る。
+    """
+
+    def __init__(self, image_path, dic_path, anf_path=None):
+        a = _addresses(dic_path)
+        self.NIN, self.KUT = a["pebobe"], a["pebobo"]
+        self.NAA, self.NBB = a["pebopa"], a["pebopi"]
+        self.RHO, self.NVT, self.OVF = a["pebopu"], a["pebopo"], a["pepabe"]
+        self.TAB, self.WIT, self.PCO = a["pepube"], a["pepupu"], a["pepupe"]
+        self.ANF = a["pobepu"]
+        self.RHOMAX, self.STRIDE = a["pebebo"], a["pebepa"]
+        self.words = a["pobepu"] + (1 << 14) + 262144
+        self.tab = vcpu.translate(vcpu.decode(open(image_path, "rb").read()))[1]
+        self.anf_tab = None
+        if anf_path:
+            self.anf_tab = vcpu.translate(vcpu.decode(open(anf_path, "rb").read()))[1]
+
+    def _run(self, tab, table, n, cut=None):
+        lane = vcpu.Lane(self.words)
+        lane.M[self.NIN] = n
+        if cut is not None:
+            lane.M[self.KUT] = cut
+        for v, b in enumerate(table):
+            if b:
+                lane.M[self.TAB + v] = 1
+        if vcpu.run_lane(tab, lane) != 0:
+            raise ValueError("接合秩の文が失敗しました")
+        return lane.M
+
+    def support(self, table, n):
+        """正規形の台。a_T = ⊕_{R⊆T} f(R)(R1 のメビウス変換)"""
+        if self.anf_tab is None:
+            return []
+        M = self._run(self.anf_tab, table, n)
+        return [t for t in range(1 << n) if M[self.ANF + t]]
+
+    def __call__(self, table, n, cut):
+        """頂点値の表とカットから ρ、分離積、そして図に要る台を返す。
+
+        psup[r] は p_r の台。添字はそのまま [n] の番号になる。
+        qsup[r] は q_r の台。B 側の番号なので κ だけ左へずらす。
+        """
+        M = self._run(self.tab, table, n, cut)
+        if M[self.OVF]:
+            raise ValueError("接合秩が語の容量 %d を越えた" % (self.RHOMAX - 1))
+        rho, na, nb = M[self.RHO], M[self.NAA], M[self.NBB]
+        q = [[M[self.WIT + self.STRIDE * r + b] for b in range(nb)] for r in range(rho)]
+        p = [[M[self.PCO + self.RHOMAX * x + r] for x in range(na)] for r in range(rho)]
+        out = {"n": n, "cut": cut, "rho": rho, "p": p, "q": q,
+               "anf": [t for t in range(1 << n) if M[self.ANF + t]]}
+        out["psup"] = [self.support(p[r], cut) for r in range(rho)]
+        out["qsup"] = [[s << cut for s in self.support(q[r], n - cut)] for r in range(rho)]
+        return out
Index: trunk/kernel/scope.py
===================================================================
trunk/kernel/scope.py
new file mode 100644
--- a/trunk/kernel/scope.py	(nonexistent)
+++ b/trunk/kernel/scope.py	(revision 2)
@@ -0,0 +1,336 @@
+# -*- coding: utf-8 -*-
+"""commonc の作業領域を画面の形へ写す。
+
+doc: commonc.alloc commonc.stages plain.tensor casm.lane64.block
+
+compile が終わった lane には、commonc が自分で組んだ表がそのまま残っている
+(19 §3.2)。この module はその表を読むだけで、計算を足さない。
+
+    語 4    B        配列の刻み
+    語 5    n_syl    音節の数
+    語 6    n_box    箱の数
+    語 132  BODY     本文の最初の音節番号。手前は採用語彙の表
+    SYL   1B         音節番号
+    OPK   4B         種類  1 Cst 2 Add 3 Mul 4 Neg 5 Store 6 Ok 7 Load 8 EqBr 9 LtBr
+    OPA   6B         第一引数の箱番号(Cst では分子)
+    OPB   8B         第二引数の箱番号
+    OPD  10B         深度 δ
+    OPL  12B         分岐先の箱番号
+
+覆いは λ(w) = 語 64 + w(19 式 6.1)なので、実行した後の語 64+w が箱 w の分子になる。
+分子と深度の対で二進有理数が決まる。
+
+    値(w) = OPA・OPB から組んだ分子 / 2^OPD[w]                    01 §1
+"""
+
+import generators
+
+KIND = {1: "Cst", 2: "Add", 3: "Mul", 4: "Neg", 5: "Store",
+        6: "Ok", 7: "Load", 8: "EqBr", 9: "LtBr"}
+
+# 引数の欄を辺として読む種類。Cst の OPA は分子であって箱番号ではない
+EDGES = {2: (True, True), 3: (True, True), 4: (True, False),
+         5: (True, True), 7: (True, False), 8: (True, True), 9: (True, True)}
+
+WIRE_BASE = 64          # 19 式 6.1
+
+
+def arrays(M):
+    """commonc の表を切り出す。返りは辞書一つ"""
+    B = M[4]
+    n_syl, n_box = M[5], M[6]
+    return {
+        "B": B,
+        "nSyl": n_syl,
+        "nBox": n_box,
+        "nNeed": M[3],
+        "body": M[132],
+        "syl": M[B:B + n_syl],
+        "opk": M[4 * B:4 * B + n_box],
+        "opa": M[6 * B:6 * B + n_box],
+        "opb": M[8 * B:8 * B + n_box],
+        "opd": M[10 * B:10 * B + n_box],
+        "opl": M[12 * B:12 * B + n_box],
+    }
+
+
+# ===== 第一段:音節列を語と層へ切る(16 §2)=====
+#
+# 疎テンソル S(k,q,r) は音節列の中に既に入っている。
+#
+#   r   層境界音 ka の出現回数
+#   q   層の中の位置。無声ワイヤ ki が一本ぶん進める
+#
+# 層の切れ目だけを数えるので、ここに文法解析は現れない。
+
+def words(a, lexicon=None):
+    """本文の音節を語へ切り、層番号と位置を付ける。表の区間は落とす"""
+    body = generators.read(a["syl"][a["body"]:], lexicon)
+    out, r, q = [], 0, 0
+    for spelling, symbol, pin, pout, boxes, layer, _n in body:
+        if spelling == "ka":
+            r += 1
+            q = 0
+            continue
+        out.append({"syl": spelling, "sym": symbol, "pin": pin, "pout": pout,
+                    "boxes": boxes, "cls": layer, "r": r, "q": q})
+        q += 1
+    return out
+
+
+# ===== 採用語彙の見出し(16 §1.3〜1.5)=====
+#
+# 見出しは文を引く。Lex ⊆ Σ* × C(16 式 1.5)なので、余域はチェンバーであって
+# 原子箱ではない。差し込み(式 1.6)は書かれた位置 q から文の層を置くので、
+# 見出しの境界の幅は文を畳めば出る。
+#
+# 文を畳むときは、机が足りなくなった分を「外から借りた」と数える。
+# 借りた本数が Γ⁻ の幅、畳み終えた机の高さが Γ⁺ の幅になる。
+
+def fold(text, table):
+    """文ひとつの (pin, pout, 箱の本数)。table は先に畳んだ見出しの表"""
+    front, borrowed, boxes = [], 0, 0
+    layer = []
+    for spelling, _sym, pin, pout, bx, _cls, _n in generators.read(
+            generators.stream(text), table):
+        if spelling == "ka":
+            front, borrowed, boxes = _fold_layer(front, layer, borrowed, boxes)
+            layer = []
+            continue
+        layer.append((spelling, pin, pout, bx))
+    front, borrowed, boxes = _fold_layer(front, layer, borrowed, boxes)
+    return borrowed, len(front), boxes
+
+
+def _fold_layer(front, layer, borrowed, boxes):
+    cur, out = 0, []
+    for spelling, pin, pout, bx in layer:
+        if bx is None:
+            boxes = None
+        elif boxes is not None:
+            boxes += bx
+        take = 1 if spelling == "ki" else pin
+        for _ in range(take):
+            if cur >= len(front):
+                front = front + ["Γ⁻"]
+                borrowed += 1
+            if spelling == "ki":
+                out.append(front[cur])
+            cur += 1
+        if spelling != "ki":
+            out += [spelling] * pout
+    return out + front[cur:], borrowed, boxes
+
+
+def lexicon(entries):
+    """`.dic` の行を順に畳む。後の行は前の見出しを引ける"""
+    table = {}
+    for _n, name, body in entries:
+        try:
+            table[name] = fold(body, table)
+        except ValueError:
+            table[name] = (0, 0, None)
+    return table
+
+
+# ===== 第二段:層ごとの frontier(19 §4.2)=====
+#
+# 箱は現在位置 q から消費する。無声ワイヤ ki が一本を素通しして位置を一つ進める。
+#
+#   fr(Λ_{r+1}) = fr(Λ_r) の未消費部 ‖ 層 r の出力
+#
+# 位置 0 が机の上になる。hu は机の上へ置き、ki hu は一つ奥へ差し込む。
+
+def frontier(ws):
+    """層ごとの机と、箱が机のどこを取ってどこへ置いたか。
+
+    返りの一行は
+
+        r      層番号
+        in     入口の机。欄は語の綴り
+        out    出口の机
+        put    [{syl, take, give, at}]  take は入口の区間、give は出口の区間
+    """
+    rows, front = [], []
+    for r in range(max((w["r"] for w in ws), default=-1) + 1):
+        layer = [w for w in ws if w["r"] == r]
+        if not layer:
+            continue
+        cur, out, put = 0, [], []
+        for w in layer:
+            if w["syl"] == "ki":
+                if cur < len(front):
+                    out.append(front[cur])
+                put.append({"syl": "ki", "take": [cur, cur + 1],
+                            "give": [len(out) - 1, len(out)], "wire": True})
+                cur += 1
+                continue
+            at = len(out)
+            out += [w["syl"]] * w["pout"]
+            put.append({"syl": w["syl"], "cls": w["cls"],
+                        "take": [cur, cur + w["pin"]],
+                        "give": [at, at + w["pout"]], "wire": False})
+            cur += w["pin"]
+        rest = front[cur:]
+        for k in range(len(rest)):
+            put.append({"syl": rest[k], "take": [cur + k, cur + k + 1],
+                        "give": [len(out) + k, len(out) + k + 1], "wire": True})
+        rows.append({"r": r, "in": list(front), "out": out + rest, "put": put})
+        front = out + rest
+    return rows
+
+
+# ===== 第三段:箱の DAG(19 §4.2、§4.3)=====
+
+def boxes(a, wire=None):
+    """箱を節点、OPA と OPB を辺として並べる。
+
+    wire は実行した後の作業領域。渡すと語 64+w を分子として添える。
+    """
+    opk, opa, opb, opd, opl = a["opk"], a["opa"], a["opb"], a["opd"], a["opl"]
+    out = []
+    for i in range(a["nBox"]):
+        k = opk[i]
+        ua, ub = EDGES.get(k, (False, False))
+        node = {"i": i, "kind": KIND.get(k, str(k)), "d": opd[i],
+                "in": [x for x, use in ((opa[i], ua), (opb[i], ub)) if use]}
+        if k == 1:
+            node["num"] = opa[i]
+        if k in (8, 9):
+            node["to"] = opl[i]
+        if wire is not None and WIRE_BASE + i < len(wire):
+            node["v"] = wire[WIRE_BASE + i]
+        out.append(node)
+    return out
+
+
+def gamma(a):
+    """出口境界 Γ⁺。末尾の Cst と Store の連なりが語 0.. を埋める(19 §2.1)"""
+    opk, opa = a["opk"], a["opa"]
+    i = a["nBox"] - 1
+    out = []
+    while i >= 0 and opk[i] in (1, 5, 6):
+        if opk[i] == 5 and opk[opa[i]] == 1 and opa[opa[i]] < WIRE_BASE:
+            out.append({"word": opa[opa[i]], "box": a["opb"][i]})
+        i -= 1
+    return sorted(out, key=lambda x: x["word"])
+
+
+def align(ws, a):
+    """語と箱を並べて突き合わせる。
+
+    生成元ごとに開く箱の本数は 16 §5 の表で決まる。読みの順に数えて合えば、
+    画面の語と DAG の節点が一対一で結べる。判定値 Q の語は本数が固定でないので、
+    その場合は結ばずに ok = False を返す。
+    """
+    n, spans = 0, []
+    for w in ws:
+        if w["boxes"] is None:
+            return {"ok": False, "why": "箱の本数が固定でない語がある", "spans": []}
+        spans.append([n, n + w["boxes"]])
+        n += w["boxes"]
+    tail = a["nBox"] - n
+    if tail < 0:
+        return {"ok": False, "why": "箱が語の総和に足りない", "spans": []}
+    return {"ok": True, "spans": spans, "tail": [n, a["nBox"]]}
+
+
+# ===== 第四段:lane64 の image(20 §7)=====
+
+def image(vcpu, img):
+    """block への分け方(式 7.4)と、block の中の層(式 7.1、7.2)"""
+    prog = vcpu.decode(img)
+    _ent, _idx, bl = vcpu.blocks(prog)
+    out = []
+    for pc, body, term, _stop in bl:
+        lay = vcpu.layers(prog, body)
+        out.append({"pc": pc, "n": len(body),
+                    "term": vcpu.NAME[prog[term][0]] if term is not None else "落ちる",
+                    "layers": [len(x) for x in lay]})
+    kinds = {}
+    for ins in prog:
+        kinds[vcpu.NAME[ins[0]]] = kinds.get(vcpu.NAME[ins[0]], 0) + 1
+    return {"bytes": len(img), "insns": len(prog), "blocks": out, "kinds": kinds}
+
+
+# ===== 二進有理数(01 §1、20 §0.3)=====
+
+def dyad(num, d):
+    """x/2^δ を約分して (分子, 分母, 十進) にする"""
+    while d > 0 and num % 2 == 0:
+        num //= 2
+        d -= 1
+    den = 1 << d
+    return {"num": num, "den": den, "dec": num / den if den else 0.0}
+
+
+# ===== 読む前の診断 =====
+#
+# commonc は誤りを全部「報告 42」で返す。どこを直せばよいかが分からないので、
+# 平文の側で分かる範囲を先に見る。ここで見るのは三つだけになる。
+#
+#   1. 音節表の外の綴り          19 式 4.1
+#   2. 机が足りない              平文は Γ⁻ = I から始まる(16 §1.1)
+#   3. 型の食い違い              Bit を語へ書く、Ω の閉じへ Dyad を渡す
+#
+# 断定できない所は黙る。commonc の判定を上書きしない。
+
+# 語が出す値の型。分からない語は None にして、その先の判定をやめる
+_CLASS = {
+    "hu": "dyad", "no": "dyad", "ha": "dyad", "ti": "dyad", "se": "dyad",
+    "mi": "dyad", "mo": "dyad",
+    "hi": "bit", "so": "bit", "ne": "bit", "ra": "bit", "go": "bit",
+    "to": "judge", "nu": "judge", "yu": "judge", "ye": "judge", "yo": "judge",
+    "ri": "judge", "ru": "judge", "na": "judge", "ni": "judge",
+    "re": "trace", "sa": "trace", "si": "trace", "ke": "trace",
+    "su": "trace", "ro": "trace", "wa": "trace",
+    "wi": "point", "ko": "point", "ta": "point", "de": "point", "do": "point",
+    "wu": "reflection", "we": "reflection", "wo": "reflection", "ga": "reflection",
+    "gi": "point",
+}
+
+_TYPE_NAME = {"dyad": "数", "bit": "判定", "judge": "判定値 𝒬"}
+
+
+def check(text, table=None):
+    """平文を読む前に見る。直す場所が分かる文言を返す。問題が無ければ None"""
+    try:
+        syl = generators.stream(text)
+    except ValueError as e:
+        return str(e)
+
+    front, layer = [], []
+    for spelling, _sym, pin, pout, _bx, _cls, _n in generators.read(syl, table or {}):
+        if spelling == "ka":
+            msg, front = _check_layer(front, layer)
+            if msg:
+                return msg
+            layer = []
+            continue
+        layer.append((spelling, pin, pout))
+    msg, _front = _check_layer(front, layer)
+    return msg
+
+
+def _check_layer(front, layer):
+    cur, out = 0, []
+    for spelling, pin, pout in layer:
+        take = 1 if spelling == "ki" else pin
+        got = []
+        for _ in range(take):
+            if cur >= len(front):
+                return ("机に置いた物が足りない。「%s」は %d つ取るが、机にはそれだけ無い。"
+                        "平文は空の机から始まるので、足りない分は hu で立てる" % (spelling, take)), front
+            got.append(front[cur])
+            cur += 1
+        if spelling == "mu" and len(got) == 2 and got[1] in ("bit", "judge"):
+            return ("%s を語へ書けない。mu が取る値は数でなければならない。"
+                    "mo を挟んで数へ戻す" % _TYPE_NAME[got[1]]), front
+        if spelling == "yi" and got and got[0] == "dyad":
+            return ("Ω の閉じ yi は判定を取る。いま机の上にあるのは数なので、"
+                    "hi などの判定をそのまま渡す"), front
+        if spelling == "ki":
+            out += got
+        else:
+            out += [_CLASS.get(spelling, None)] * pout
+    return None, out + front[cur:]
Index: trunk/kernel/session.py
===================================================================
trunk/kernel/session.py
new file mode 100644
--- a/trunk/kernel/session.py	(nonexistent)
+++ b/trunk/kernel/session.py	(revision 2)
@@ -0,0 +1,172 @@
+# -*- coding: utf-8 -*-
+"""セル一つを compile して実行し、scope を組む。
+
+doc: commonc.pipeline casm.lane64.host plain.format
+
+道は一本になる(19 §7.1)。
+
+    .dic + .cmn ──(commonc_lane64.bin on lane64)──▶ lane64 image ──(lane64)──▶ M
+
+compile の受け渡しは toolchain.compile と同じだが、入口が path ではなく文字列で、
+commonc の作業領域を捨てずに返す。scope はその作業領域から組む。
+
+CPython でも Pyodide でも同じ code が動く。違うのは commonc の image の場所だけで、
+それは start() の引数で決まる。
+"""
+
+import hashlib
+import os
+import sys
+import tempfile
+
+import scope
+
+_HERE = os.path.dirname(os.path.abspath(__file__))
+if _HERE not in sys.path:
+    sys.path.insert(0, _HERE)
+
+import lex          # noqa: E402  Python_vCPU から借りる
+import toolchain    # noqa: E402
+import vcpu         # noqa: E402
+
+WORK = toolchain.WORK               # 本文の作業領域の基底。ワイヤ(語 64+w)の上
+DEFAULT_WORDS = WORK + (1 << 13)
+DEFAULT_BUDGET = 1 << 24            # block を辿る上限。止まらないセルをここで止める
+
+
+class CellError(Exception):
+    pass
+
+
+def start(commonc):
+    """commonc の image の場所を決める。翻訳は最初の compile のときに一度だけ行う"""
+    toolchain.COMMONC = commonc
+
+
+# ===== compile =====
+#
+# host が commonc へ渡すもの(19 §3.1)。toolchain.compile と同じ値を置く。
+#
+#   語 0    N      入力の byte 数(表 + 本文)
+#   語 1    IB     入力の基底語番号
+#   語 4    B      配列の刻み
+#   語 130  LEXB   表の byte 数
+
+# 読み取り専用の場所へ入れても動くように、表は一時フォルダへ書く
+_DIC = os.path.join(tempfile.gettempdir(), "common_scope_cell.dic")
+
+
+def _dic_file(text):
+    """採用語彙の表を lex へ渡すために一度だけ file にする"""
+    open(_DIC, "w", encoding="utf-8", newline="\n").write(text)
+    return _DIC
+
+
+def compile_text(source, dic=None):
+    """平文を image にする。返りは (image, n_need, commonc の作業領域)"""
+    table, est, fold = "", len(source) // 2, {}
+    if dic and dic.strip():
+        path = _dic_file(dic)
+        table = lex.lexicon(path)
+        est = lex.expanded_syllables(path, source)
+        fold = scope.lexicon(lex.entries(path))
+    # commonc を正本にする。scope.check は表示用の補助表から行う診断なので、
+    # Common 本体より先に文を棄却してはいけない。語彙が増えたときに補助表だけが
+    # 古いと、正規の commonc では通る文を notebook だけが拒否してしまうためになる。
+    data = (table + source).encode("utf-8")
+    n = len(data)
+    b = max(n + 80, 4096, 2 * est + 80)
+    base = toolchain.IN_MUL * b
+    lane = vcpu.Lane(base + n + 4096)
+    lane.put_input(list(data), base)
+    lane.M[toolchain.W_B] = b
+    lane.M[toolchain.W_LEXB] = len(table.encode("utf-8"))
+    rep = vcpu.run_lane(toolchain._commonc(), lane)
+    if rep != 0:
+        # commonc が実際に拒否したときだけ、平文側の診断で理由を細かくする。
+        # 診断表が Common の全語彙を知らなくても、成功した文を壊すことはない。
+        hit = scope.check(source, fold)
+        if hit:
+            raise CellError(hit)
+        raise CellError("commonc がこの文を読めない(報告 %s)。"
+                        "音節表の外の綴りか、机の上が合っていない" % rep)
+    imgb, nimg, need = lane.M[1], lane.M[2], lane.M[3]
+    if not (imgb and nimg):
+        raise CellError("commonc が image を出さない")
+    if need > WORK:
+        raise CellError("箱が多すぎてワイヤが作業領域に重なる(n_need %d > %d)" % (need, WORK))
+    return bytes(v & 255 for v in lane.M[imgb:imgb + nimg]), need, lane.M
+
+
+# ===== 実行する =====
+#
+# ワイヤの語を落とす覆い(toolchain.load の wires)は使わない。scope は
+# 箱ひとつずつの値を見せるので、語 64+w を全部残す。
+
+def run_image(image, seeds=None, words=DEFAULT_WORDS, budget=DEFAULT_BUDGET):
+    tab = vcpu.translate(vcpu.decode(image))[1]
+    lane = vcpu.Lane(words)
+    for k, v in (seeds or {}).items():
+        lane.M[int(k)] = int(v)
+    try:
+        rep = vcpu.run_lane(tab, lane, budget=budget)
+    except RuntimeError:
+        raise CellError("block を %d 回辿っても終わりません。Ω の「もう良いか」を見直す" % budget)
+    except IndexError:
+        raise CellError("語番号が作業領域を越えた(語数 %d)。セルの words を増やす" % words)
+    return rep, lane
+
+
+def cell(source, dic=None, seeds=None, words=DEFAULT_WORDS, budget=DEFAULT_BUDGET):
+    """セル一つ。compile して実行し、scope を返す"""
+    image, need, cm = compile_text(source, dic)
+    rep, lane = run_image(image, seeds, words, budget)
+
+    table = scope.lexicon(lex.entries(_DIC)) if (dic and dic.strip()) else {}
+    a = scope.arrays(cm)
+    ws = scope.words(a, table)
+    bx = scope.boxes(a, lane.M)
+    gm = scope.gamma(a)
+    depth = {g["word"]: a["opd"][g["box"]] for g in gm}
+    return {
+        "ok": True,
+        "report": rep,
+        "source": source,
+        "size": {"syl": a["nSyl"] - a["body"], "box": a["nBox"],
+                 "need": need, "image": len(image)},
+        # 二つの平文が同じチェンバーかを見る hash。image が一致すれば読みも一致する
+        "mark": hashlib.sha256(image).hexdigest()[:16],
+        "words": ws,
+        "frontier": scope.frontier(ws),
+        "boxes": bx,
+        "align": scope.align(ws, a),
+        "gamma": [dict(g, **scope.dyad(lane.M[g["word"]], depth[g["word"]]))
+                  for g in gm],
+        "image": scope.image(vcpu, image),
+        "out": [lane.M[k] for k in range(64)],
+        "put": bytes(lane.OUT).decode("latin-1"),
+    }
+
+
+# ===== 接合秩(Common-Lang/1 定理 4.1)=====
+#
+#   F[α][β] = f(α, β),   ρ = rank_F2 F,   f = ⊕_{r<ρ} p_r(x_A) q_r(x_B)
+#
+# 階数は common_apps/joinrank の平文が持つ。ここは頂点値の表を作って渡すだけになる。
+# 表は同じ image を 2^n 回実行して集める。lane の作業領域は交わらない(20 式 1.2)ので、
+# 実行は互いに独立になる。
+
+def vertices(image, inputs, words=DEFAULT_WORDS, budget=DEFAULT_BUDGET, out=0):
+    """入力の語へ {0,1}^n を全部当て、語 out の値を頂点値として並べる"""
+    n = len(inputs)
+    if n > 12:
+        raise CellError("入口が %d 本。頂点は 2^n なので 12 本までにする" % n)
+    tab = vcpu.translate(vcpu.decode(image))[1]
+    tbl = []
+    for v in range(1 << n):
+        lane = vcpu.Lane(words)
+        for k, w in enumerate(inputs):
+            lane.M[int(w)] = (v >> k) & 1
+        vcpu.run_lane(tab, lane, budget=budget)
+        tbl.append(1 if lane.M[out] else 0)
+    return tbl
Index: trunk/notebooks/first.json
===================================================================
trunk/notebooks/first.json
new file mode 100644
--- a/trunk/notebooks/first.json	(nonexistent)
+++ b/trunk/notebooks/first.json	(revision 2)
@@ -0,0 +1,43 @@
+{
+  "title": "名前のない notebook",
+  "lead": "",
+  "dic": "",
+  "cells": [
+    {
+      "kind": "cmn",
+      "text": "# これがCommonで書けるプログラムです。\n\n",
+      "source": "we re ka, ki sa ka, ki si ka, ki wi ka, gi ka.",
+      "cut": 0,
+      "inputs": [
+        -1
+      ]
+    },
+    {
+      "kind": "cmn",
+      "text": "",
+      "source": "ma ma ma ma ka, zu ki zu ze ka, ri ri ka, yu ka.",
+      "cut": 1,
+      "inputs": [
+        1
+      ]
+    },
+    {
+      "kind": "cmn",
+      "text": "",
+      "source": "ma ma ma ma ma ma ma ma ka,\nzu ki ki zu zu ki ki ze ka,\nki ki ki ze ki ki ki zu ka,\nri ri ri ri ka,\nnu nu ka,\nyu ka.",
+      "cut": 0,
+      "inputs": [
+        0
+      ]
+    },
+    {
+      "kind": "cmn",
+      "text": "# そして、これがCommonの最小のプログラムです。\n\nHello Worldの相当物とでも呼べるでしょうか。",
+      "source": ""
+    },
+    {
+      "kind": "note",
+      "text": ""
+    }
+  ]
+}
Index: trunk/runtime/__pycache__/lex.cpython-313.pyc
===================================================================
trunk/runtime/__pycache__/lex.cpython-313.pyc
new file mode 100644
--- a/trunk/runtime/__pycache__/lex.cpython-313.pyc	(nonexistent)
+++ b/trunk/runtime/__pycache__/lex.cpython-313.pyc	(revision 2)
@@ -0,0 +1,53 @@
+�
+
+z�j���b�SrSSKrSrSrSrSrSrSr\R"S	5r	S
+r
+Srg)u%採用語彙の表(`.dic`)を読む。見出しは be bo pa pi pu pe po の七音で綴り、中身はこの言語の文で書く。
+
+    pepe        hu ka, he ka, no ka, he ka, no ka, he ka, no ka.
+    popo        pepe ka, ki hu ka, no ka.
+    pupu        =40                                   数だけの語は = で書ける(綴りは spell)
+
+表を読むのは commonc で、この module は行を並べるだけになる(16 式 1.5: Lex ⊆ Σ* × C)。
+`=N` の行は数を綴った文へ置き換えて渡す。`#` の行と空行は落とす。
+
+辞書の語は全部 I → D で、番地を机に一つ置く。値にするのは文の中の mi、
+書くのは 値 ka, 番地 ka, mu ka になる。Python が観測を語へ写すときの番地は
+addresses() の表から取る。
+�N)�be�bo�pa�pi�pu�pe�poc���US:a[U*5S-$US:XagS/n[U5SSH-nURS5 US:XdMURS	5 M/ S
+RU5$)u�整数を基準の音節で綴る。二進の Horner: 上の桁から「もういちど、あわせる」で倍にし、
+桁が 1 なら「ひとつ、あわせる」を足す。rz, ha kazhu ka, he ka, ki ha ka, no kazhu ka�Nzhe ka, no ka�1zki hu ka, no kaz, )�spell�bin�append�join)�n�out�bits   �./mnt/data/common_scope_notebook/runtime/lex.pyr
+r
+sq��	�1�u��a�R�y�9�$�$��A�v�.��)�C��1�v�a�b�z���
+�
+�>�"��#�:��J�J�(�)���9�9�S�>��c	�^�[T5S-S:H=(a) [U4Sj[S[T5S555$)N�rc3�@># �UHnTXS-[;v� M g7f)rN)�LETTERS)�.0�i�names  �r�	<genexpr>�spelled.<locals>.<genexpr>%s ����%_�H^�1�d�1��U�m�w�&>�H^�s�)�len�all�range)rs`r�spelledr"$s7����t�9�q�=�A��_�#�%_��a�QT�UY�QZ�\]�H^�%_�"_�_rc��/n[[USS9S5H�up#URS5nUR5(a$UR	5RS5(aMQUR
+S5upEnUR5UR5pd[U5(d[SXU4-5eURS5(a[[USS	55S
+-nURX$U45 M� U$)u](行番号, 見出し, 文) の列。# 行と空行は飛ばす。=N は綴った文にする�utf-8��encoding��
+�#�	u6%s:%d: 見出し %s は be bo pa pi pu pe po で綴る�=N�.)�	enumerate�open�rstrip�strip�lstrip�
+startswith�	partitionr"�
+ValueErrorr
+�intr)�dicrr�liner�_�bodys       r�entriesr:(s���
+�C��T�#��8�!�<����{�{�4� ���z�z�|�|�t�{�{�}�7�7��<�<�����t�,�
+����Z�Z�\�4�:�:�<�d��t�}�}��U�Y\�ae�Xf�f�g�g��?�?�3�����T�!�"�X��'�#�-�D��
+�
+�A�T�?�#�=��Jrc�D�SRS[U555$)uQcommonc へ渡す表の文字列。一行が 見出し ⟨tab⟩ 文 ⟨改行⟩�c3�<# �UHupo2S-U-S-v� M g7f)r*r(N�)rr8rr9s    rr�lexicon.<locals>.<genexpr>;s ���O�,���$�$�;��%��,�,�s�)rr:)r6s r�lexiconr@9s��
+�7�7�O�'�#�,�O�O�Orc��0n[USS9H�nURS5nUR5(a$UR5R	S5(aMOURS5up4nUR5R	S5(dM�[
+UR5SS5XR5'M� U$)	u,数だけの語(=N)の表 {見出し: N}r$r%r(r)r*r+r'N)r.r/r0r1r2r3r5)r6rr7rr8r9s      r�	addressesrB>s���
+�C��S�7�+���{�{�4� ���z�z�|�|�t�{�{�}�7�7��<�<�����t�,�
+����:�:�<�"�"�3�'�'� #�D�J�J�L���$4� 5�C�
+�
+���
+,��Jrz[a-z]+c�`�0n[U5Hup4n[XR5X$'M [X5$)uh表を展開した後の音節の数。commonc の配列の刻み B を決めるためだけに数える)r:�_count)r6r9�sizer8r�texts      r�expanded_syllablesrGNs0��
+�D� ���
+����D�'��
+�&��$��rc��Sn[RU5H%nX1;a	X!U-
+nMU[U5S-S--
+nM' U$)Nrr'r)�_TOKEN�findallr)rFrE�total�toks    rrDrDVsI��
+�E��~�~�d�#���;��#�Y��E��c�#�h��l�q�(�(�E�	$�
+�Lr)�__doc__�rerr
+r"r:r@rB�compilerIrGrDr>rr�<module>rPsI���
+�
+4���`��"P�
+
+�
+���I�	���r
\ No newline at end of file
Index: trunk/runtime/__pycache__/toolchain.cpython-313.pyc
===================================================================
trunk/runtime/__pycache__/toolchain.cpython-313.pyc
new file mode 100644
--- a/trunk/runtime/__pycache__/toolchain.cpython-313.pyc	(nonexistent)
+++ b/trunk/runtime/__pycache__/toolchain.cpython-313.pyc	(revision 2)
@@ -0,0 +1,177 @@
+�
+
+z�j�)���SrSSKrSSKrSSKrSSKrSSKr\RR\RR\	55r
+\RR\RR"\
+/\R/S-Q765r
+\RR\
+SSS5r\
+\R;a\RRS\
+5 SSKrSSKrSrSrS	urrS
+r"SS\5rS
+r/rSrSrSrSSjrSrSr Sr!Sr"Sr#Sr$"SS\%5r&\'S:XaS\RP;a\$"5 ggg)u_平文を綴じて commonc で lane64 の image にし、vcpu.py の lane に配って走らせる。
+
+doc: commonc.lexicon casm.lane64.host casm.lane64.state
+
+    image, need = compile([a.cmn, b.cmn], dic, out)   順に綴じて compile(16 式 1.3: 連接が合成)
+    tab   = load(image)
+    M     = run(tab, words, {8: 3})                    一枚
+    heads = LaneWorkers(image, 6).run(words, seeds)    lane ごとに種を変えて配る(20 §1)
+
+道は一本になる(19 §7.1)。
+
+    .dic + .cmn ──(commonc_lane64.bin on vcpu.py)──▶ lane64 image ──(vcpu.py)──▶ M
+
+commonc の image は Haskell が `.cam` から作る。この module は `.cmn` を読まない。
+
+    common commonc_lane64.cam -t lane64 --no-sim -o builds/commonc/commonc_lane64.bin
+
+host が commonc へ渡すもの(19 §3.1 と front.cam の割付):
+
+    語 0    N      入力の byte 数(表 + 本文)
+    語 1    IB     入力の基底語番号
+    語 4    B      配列の刻み。表を展開すると音節が byte 数より増えるので host が決める
+    語 130  LEXB   表の byte 数。表は本文の前に置く
+
+commonc の lane64 版はワイヤ w を語 64 + w に置く(19 §3.3)。本文の作業領域はその上、
+WORK = 2^16 から取る。compile 後の n_need が WORK を越えたら止める。
+
+置き場は `common_systems/Python_vCPU`。実行台(vcpu、vcpu_vec)と同じ階層に置く。
+借り手は automaton、joinrank、okataduke、LTLS、Joint-Log-Former、kaggriculture の
+六つで、どれか一つのために書き換えてよい module ではない。
+�N��builds�commonczcommonc_lane64.binz
+
+i)��i c��\rSrSrSrg)�CompileError�6�N)�__name__�
+__module__�__qualname__�__firstlineno__�__static_attributes__r��4/mnt/data/common_scope_notebook/runtime/toolchain.pyr	r	6s��rr	c���UVs/sH)n[USS9R5R5PM+ nn[USSSS9R[RU5S-5 U$s snf)N�utf-8��encoding�w�
+)r�newline)�open�read�strip�write�SEP�join)�paths�dst�p�bodys    r�weaver$:s`��>C�D�e��D��W�%�*�*�,�2�2�4�e�D�D���c�G�T�2�8�8����$��$�9N�O��J��Es�0A*c
+�h�[(d�[RR[5(d[S[<S[<35e[R
+[R"[R"[[S5R555S5 [S$)Nucommonc の image が無い: z3
+  common commonc_lane64.cam -t lane64 --no-sim -o �rb�r)�_CC�os�path�exists�COMMONCr	�append�vcpu�	translate�decoderrrrr�_commoncr1Csq���3��w�w�~�~�g�&�&��Y`�bi� k�l�
+l��
+�
+�4�>�>�$�+�+�d�7�D�.A�.F�.F�.H�"I�J�1�M�N��q�6�Mrc�V�[RR[RRU55=(d3 [R"[RRU55 [U5S:wa[
+XSSS-5OUSn[USS9R5nU(a[R"U5OSnXT-RS5n[U5nU(a[R"X5OUS	-n[US
+-SS	U-S
+-5n	[U	-n
+[R "X�-S-5nUR#[%U5U
+5 X�R&[('[URS55UR&[*'[R,"[/5U5nUS:wa[1SU<S
+U<S35eUR&SUR&S	UR&Sp�n
+U
+(aU(d[1SU-5eU[2:�a[1SU[24-5e[5SUR&X�U-55n[US5R7U5 [US-S5R7[9U55 UU4$)u,綴じて commonc で compile する。返りは (image の byte 列, n_need)。
+
+dic は `.dic`(見出し ⟨tab⟩ 文)か None。表の byte 数を語 130 に、刻み B を語 4 に置く。
+B は展開後の音節数から決める(配列の容量は音節数で決まる。19 §3.2)。
+r'N�����z.cmnrrr���Piucommonc が u を読めない(報告 u)ru%commonc が image を出さない: %suO箱が多すぎてワイヤが作業領域に重なる(n_need %d > WORK %d)c3�*# �UH	oS-v� M g7f)��Nr)�.0�vs  r�	<genexpr>�compile.<locals>.<genexpr>gs���<�#;�a�c�'�#;�s��wb�.needr)r)r*�isdir�dirname�makedirs�lenr$rr�lex�lexicon�encode�expanded_syllables�max�IN_MULr.�Lane�	put_input�list�M�W_B�W_LEXB�run_laner1r	�WORK�bytesr�str)r �dic�out�srcr#�table�data�n�est�b�base�lane�rep�imgb�nimg�need�images                 r�compilerbLs���G�G�M�M�"�'�'�/�/�#�&�'�L�2�;�;�r�w�w���s�7K�+L��-0��Z�1�_�%��3�B�x�&�(�
+)�%��(�C���g�&�+�+�-�D� #�C�K�K����E��L� � ��)�D��D�	�A�/2�#�
+ �
+ ��
++��Q��C��A��F�D�!�c�'�B�,�'�A��A�:�D��9�9�T�X��_�%�D��N�N�4��:�t�$��F�F�3�K�����g�.�/�D�F�F�6�N�
+�-�-��
+�D�
+)�C�
+�a�x��c�SV�W�X�X��v�v�a�y�$�&�&��)�T�V�V�A�Y��D��T��B�S�H�I�I��d�{��l�pt�vz�o{�{�|�|��<�4�6�6�$�d�{�#;�<�<�E���d�O���%� ���w����"�"�3�t�9�-��$�;�rc���[US5R5nUS-n[RR	U5(a"[[U5R55OSnX4$)uXcompile が置いた image と、その隣の n_need を読む。返りは (image, need)r&r>N)rrr)r*r+�int)r*ra�sider`s    r�	load_filerfmsQ����t��!�!�#�E��'�>�D�%'�W�W�^�^�D�%9�%9�3�t�D�z��� �!�t�D��;�rc�p�[R"[R"U5U(aSU4OSS9S$)u�image を翻訳する。need(compile が返す n_need)を渡すと、語 64 〜 need のワイヤのうち
+他の block が読まない Store を落とす(vcpu.translate の wires)。�@N��wiresr')r.r/r0)rar`s  r�loadrkus,���>�>�$�+�+�e�,�$�R��J�D�Q�RS�T�Trc���[R"U5nUR5HupEXSRU'M [R"X5nUS:wa[SU-5eUR$)uO一枚走らせて作業領域を返す。報告が tu でなければ例外。ru	報告 %s)r.rI�itemsrLrO�RuntimeError)�tab�words�seedr\�kr:r]s       r�runrs{s[���9�9�U��D��
+�
+�������q�	��
+�-�-��
+"�C�
+�a�x��;��,�-�-��6�6�Mrc���[R"U[RS9nUR[R
+"S[
+U55U-5 UR5 g)N)�protocol�<Q)�pickle�dumps�HIGHEST_PROTOCOLr�struct�packrB�flush)�f�objrWs   r�_sendr�sA���<�<��f�&=�&=�>�D��G�G�F�K�K��c�$�i�(�4�/�0��G�G�Irc���URS5n[U5S:a[S5e[R"SU5un[
+R"URU55$)N�uworker が閉じたrv)rrB�EOFErrorrz�unpackrw�loads)r}�headrXs   r�_recvr��sO���6�6�!�9�D�
+�4�y�1�}��,�-�-��=�=��t�$�D�Q��<�<����q�	�"�"rc
+��S/[UR5[-
+-n/nUH�nXQR[S&S/S-URSS&UR5Hup�X�RU'M [R
+"X5n
+UR
+X�RSUUVs/sHo�RUPM sn45 M� U$s snf)Nrrh)rBrLrPrmr.rOr-)ror\�seedsr��watch�zero�resrqrrr:r]rs            r�
+_run_seedsr��s���
+�3�#�d�f�f�+��$�%�D�
+�C������t�u�
+��c�B�h����s����J�J�L�D�A��F�F�1�I�!��m�m�C�&���
+�
+�C������E�(B�E�q�����E�(B�C�D�
+��J��)Cs�'C
+c
+��SSKnSSKn/n	[S[U5U5GH�n
+XX�-nUR	[U55nUbUR
+RSU:wa)UR[U5U5nX�[U5'O"SUR
+[S&SUR
+SS&[U5H/up�UR5HunnUUR
+X�4'M M1 URX5nUR5(a[S5eURUR
+SU5RR!5n[[U55V
+Vs/sH-o�Vs/sHn[#UR
+UU
+45PM snPM/ nn
+nU	R%['UUU55 GM� U	$s snfs snn
+f)ubox は worker の寿命で使い回す LaneVec の置き場。作業領域の確保は
+語数 x W x 8 byte を触るので、seeds の組ごとに作り直すと確保だけで束ねの
+利得が消える(wither・W=256 の実測で 0.5 倍まで落ちた)。rNrhu=語が int64 を越えた。束ねの道へ載せられない)�numpy�vcpu_vec�rangerB�getrL�shape�LaneVecrP�	enumeratermrs�overflow�
+OverflowError�asarray�T�tolistrd�extend�zip)�tabvr�rpr�r��chunk�box�npr�r��off�part�lv�lrqrrr:r]�headwr�watchws                     r�_run_seeds_vecr��s~����
+�C��Q��E�
+�E�*�����%��
+�W�W�S��Y�
+��
+�:������A��%�/��!�!�#�d�)�U�3�B���D�	�N��B�D�D���K��B�D�D��"�I� ���G�A��
+�
+����1�����Q�T�
+�%�'��l�l�4�$��
+�;�;�=�=�� _�`�`��
+�
+�2�4�4���;�'�)�)�0�0�2��<A�#�d�)�<L�M�<L�q�E�2�E�q�3�r�t�t�A�q�D�z�?�E�2�<L��M��
+�
+�3�s�E�6�*�+�#+�$�J��3��Ms�,	G�5$G�G�Gc�|�[RR[RRp[	U5up#n[X#5nSnU(a7SSKnUR[R"U5U(aSU4OSS9SnS0p�[	U5up�p�Ub[U[XkX�X�U	55 M.Ub[UR 5U
+:wa[R""U
+5n[U[%XXX�U
+55 Mx![a SnN�f=f![a gf=f![a S0p�N|f=f)u�子 process の本体。最初に (image, need, width) を受け取り、
+あとは (words, seeds, head, watch) を繰り返す。
+
+width が 0 なら一枚ずつ(翻訳器の道)、正なら W 枚ずつ束ねる。
+Nrrhrir')�sys�stdin�buffer�stdoutr�rkr�r/r.r0�ImportErrorr�rr�r�rBrLrIr�)�inprTrar`�widthror�r�r\r�rpr�r�r�s              r�worker_mainr��s5���y�y������!2�!2���s���E��
+�u�
+�C��D��	���%�%�d�k�k�%�&8�d��T�
+�X\�%�]�^_�`�D��b�#�
+�	�(-�c�
+�%�E�$���
+%��c�>�$�u�E�RU�V�W���<�3�t�v�v�;�%�/��9�9�U�#�D�
+�c�:�c��e�<�=����	��D�	���	��	��!�
+%� �"�c�
+%�s6�6D	�D�$D+�	D�D�
+D(�'D(�+
+D;�:D;c�2�\rSrSrSrSSjrS	SjrSrSrg)
+�LaneWorkers��uFimage 一つを持つ worker を procs 本立てて、lane を配る。
+
+返りは lane ごとの (報告, 先頭 head 語, watch の語の値)。
+
+width を渡すと worker の中で W 枚を束ねる(vcpu_vec)。作業領域は
+語数 x width x 8 byte を取るので、語数 225536・width 256 で 462 MB になる。
+Nc�x�/Ul[[SU55H�n[R"[
+R[RR[5S/[R[RS9n[URXU45 URRU5 M� g)Nr'�--worker)r�r�)�procsr�rG�
+subprocess�Popenr��
+executabler)r*�abspath�__file__�PIPErr�r-)�selfrar�r`r��_r"s       r�__init__�LaneWorkers.__init__�s{����
+��s�1�e�}�%�A�� � �#�.�.�"�'�'�/�/�(�2K�Z�!X�'1���z���P�A��!�'�'�E��/�0��J�J���a� �	&rc
+��[UR5n[U5Vs/sH
+obUSU2PM nn[URU5H'up�[	UR
+XU[
+U545 M) S/[U5-n
+[UR5H5uph[[UR55Hup�X�XkU--'M M7 U
+$s snf�N)
+rBr�r�r�rr��tupler�r�r�)
+r�rpr�r�r�rXrr�partsr"r�rT�i�rs
+             rrs�LaneWorkers.run�s�����
+�
+�O��&+�A�h�/�h��q�t�!�t��h��/��4�:�:�u�-�G�A��!�'�'�E��u�U�|�<�=�.��f�s�5�z�!���d�j�j�)�D�A�!�%����/�2���!"�A�A��I��3�*��
+��0s�Cc���URH-nURR5 URSS9 M/ g![a UR5 MOf=f)N�)�timeout)r�r��close�wait�	Exception�kill)r�r"s  rr��LaneWorkers.close	sJ�����A�
+����
+�
+�����q��!����
+�����
+�s�)?�A�A)r�)Nr)r�r)	rr
+rr�__doc__r�rsr�rrrrr�r��s���!�	�rr��__main__r�r�))r�r)rwrzr�r�r*r@r�r��HEREr�pardir�ROOTr,�insertr.rCrrPrMrNrHr�r	r$r(r1rbrfrkrsrr�r�r�r��objectr�r�argvrrr�<module>r�s:���@
+�
+�
+��
+�	�w�w���r�w�w���x�0�1��	�w�w���r�w�w�|�|�D�=�R�Y�Y�K�!�O�=�>��
+�'�'�,�,�t�X�y�2F�
+G���s�x�x���H�H�O�O�A�t���
+��������V�	��	�9�	��	����B�U��&�#�
+�(�8>�B"�&�"�J�z��j�C�H�H�4��M�5�r
\ No newline at end of file
Index: trunk/runtime/__pycache__/vcpu.cpython-313.pyc
===================================================================
trunk/runtime/__pycache__/vcpu.cpython-313.pyc
new file mode 100644
--- a/trunk/runtime/__pycache__/vcpu.cpython-313.pyc	(nonexistent)
+++ b/trunk/runtime/__pycache__/vcpu.cpython-313.pyc	(revision 2)
@@ -0,0 +1,457 @@
+�
+
+z�j0��
+���SrSSKrSSKrSSKrSr\"S5u
+rrrr	r
+rrr
+rrrrrSr\"\\\
+\\\/5rSurrrSrSrS	rS
+rSrSrS
+r\"\\\	\
+/5r Sr!Sr"Sr#Sr$S)Sjr%Sr&Sr'S*Sjr(S*Sjr)Sr*Sr+S+Sjr,S*Sjr-"SS\.5r/S,Sjr0"SS\.5r1S r20r3S!r4S"r5S#r6"S$S%\.5r7S&r8S'r9\:S(:Xa#\Rv"\9"\Rx55 gg)-uBlane64 の実行台。
+
+仕様は docs/common-compiler/arch/20。標準機能だけで書く。
+
+道は二本ある。
+
+  解釈器  式 (2.1) の mask 付き意味をそのまま持つ。これが定義になる
+  翻訳器  block を Python の code object へ落とす。速い道になる
+
+命題 6.1 が二本の一致を保証し、test_vcpu.py がそれを実際に確かめる。
+lane の作業領域は式 (1.2) で交わらないので、翻訳器の道は lane を process へ配れる。
+
+  python vcpu.py image.bin --lanes 8 --words 65536 --procs 6 --in corpus.txt
+�N��
+)
+�HALT�MAT�ADD�MUL�NEG�EQ�LT�JMP�LD�ST�OK�KO�PUT)����������������c�n�[U5[-(a[S[[U54-5e/n[S[U5[5H`nXU[-nUR	USUSUSUSUSUSS--US	US
+S--[
+R
+USSSS
+S945 Mb U$)u�image を欄の組の並びへ開く。
+
+固定 16 byte なので、長さを数える走査が要らない。欄の並びは
+op / a / b / c / s_b / s_c / imm で、全部 little endian になる。
+u/image の byte 数が %d の倍数でない: %dr��������r�littleT��signed)�len�INSN�
+ValueError�range�append�int�
+from_bytes)�image�prog�k�ws    �//mnt/data/common_scope_notebook/runtime/vcpu.py�decoder.'s����5�z�D���J�d�TW�X]�T^�M_�_�`�`�
+�D�
+�1�c�%�j�$�
+'���A��H������Q�q�T�1�Q�4��1��q��t��q�T�Q�q�T�Q�Y�'��1���1����);��^�^�A�a��G�X�d�^�C�E�	F�(�
+�K�c
+���[5nUHEup#pEpgnU[X#XEUS-US-	US-US-	/5-
+nU[U5RSSSS9-
+nMG [U5$)uR復号の逆(式 40.1、30.4)。二つを往復させると image が戻る。��rrTr )�	bytearray�bytesr'�to_bytes)	r*�out�op�a�b�c�sb�sc�ims	         r-�encoder=8st��
+�+�C�%)�!���b�b��u�b�Q�2��8�R�1�W�b�3�h��a��H�I�I���s�2�w����8�D��9�9��&*���:�r/c��/n[U5H?unup4pVpxn	URSX#[[5:a	[UOSXEXgX�4-5 MA U$)Nz5%5d  %-4s a=%-3d b=%-3d c=%-3d sb=%-2d sc=%-2d imm=%d�?)�	enumerater&r"�NAME)
+r*r5�ir6r7r8r9r:r;r<s
+          r-�disasmrCAs\��
+�C�(1�$��$��$�B�1����
+�
+�J��#�d�)�^��b���a�A�2�R�S�	T�)8��Jr/c�$^
+�[U5m
+[S/5n[U5HUunup4pVpxn	U[;dMUR	US-5 U[
+[[4;dMBUR	X)-5 MW [U
+4SjU55$)uXblock の入口(式 7.4)。分岐の行き先と、分岐の次が入口になる。rrc3�N># �UHnSUs=::aT:dMO MUv� M g7f)rN�)�.0�x�ns  �r-�	<genexpr>�entries.<locals>.<genexpr>Ts����-�Q��!�q�*�1�*�!�*�!�Q�s�%�%�	%)	r"�setr@�TERM�addr
+rr�sorted)r*�erBr6�_a�_b�_c�_sb�_scr<rIs          @r-�entriesrVKsw����D�	�A��Q�C��A�-6�t�_�)��)�B�B�C�b�
+��:�
+�E�E�!�a�%�L��b�"�c�]�"����a�f�
+�	.=�
+�-�Q�-�-�-r/c��[U5n[U5n/n[U5HupEUS-[U5:aXS-OUnUn/nXv:a;XS[;a,UR	U5 US-
+nXv:aXS[;aM,UR	XXXv:aUOSU45 M� U[S[U555U4$)u�(入口, 直線部分の箱, 閉じる箱 or None, 次の入口) の並び。
+
+閉じる箱が None のときは、次の入口へそのまま落ちる。
+rrNc3�,# �UH
+upX!4v� M g7f�NrF)rGr+�pcs   r-rJ�blocks.<locals>.<genexpr>gs���9�.���b�W�.���)rVr"r@rMr&�dict)	r*�entrIr5r+rZ�stop�j�bodys	         r-�blocksrbWs���
+�$�-�C��D�	�A�
+�C��3������U�S��X�-�s�q�5�z�1�������h�4�7�1�:�T�1��K�K��N�
+��F�A��h�4�7�1�:�T�1�	�
+�
+�B�1�8�a��t�<�=� ���9�)�C�.�9�9�3�>�>r/c��00/pCnUH�nXSXSXSXS4upgp�Sn
+U[[4;aX�4n
+O4U[[4;aU4n
+O U[[
+4;aU[:XaX�4OU4n
+SnU
+HnX�;dM
+[
+X�US-5nM X�U'U[[[[[4;aX�U'[U5U::a"UR/5 [U5U::aM"XKRU5 M� U$)uE直線部分の因果深度(式 7.1)と層(式 7.2)。
+
+実行の速さには効かない。効くのは「並べ替えてよい」という保証のほうで、
+それが block を直線に書き下せる根拠になる(定理 21.1)。層の幅は
+その保証がどれだけ広いかの目安として出す。
+rrrrrF)
+rrr	r
+rr�maxrr"r&)
+r*ra�depth�last�layrBr6r7r8r9�pred�d�rs
+             r-�layersrkls
+���2�r��E�
+���g�a�j�$�'�!�*�d�g�a�j�$�'�!�*�D���q���
+�#�s����6�D�
+�C��9�_��4�D�
+�B��9�_��2�X�A�6�A�4�D�
+���A��y����7�Q�;�'����a��
+�#�s�C��b�)�)���G��#�h�!�m��J�J�r�N��#�h�!�m���
+�
+�a��%�&�Jr/c��Uupp4pVnU[:XaX#U-4$U[:XaX#U-XF--4$U[:XaX'4$U[:XaX#*4$[	S[
+U-5e)ub値の箱を一つ。ワイヤの値だけを受けるので、worker は state を持たない。u値の箱ではない: %s)rrrr	r$rA)�jobr6r7�u�vr:r;r<s        r-�_boxrp�sp��!��B�1���	�S�y��a�%�x��	�S�y���7�q�w�'�'�'�	�S�y��u��	�S�y��"�u��
+�0�4��8�;�
+<�<r/c���//p2UHTnXS[;aURU5 M%U(aURSU45 /nURSU45 MV U(aURSU45 U$)uZ値の箱の連なりと、作業領域を触る箱を、本文の順に切り分ける。rTF)�_ARITHr&)r*rar5�currBs     r-�_runsrt�sn���2��
+���7�1�:����J�J�q�M���
+�
+�D�#�;�'����J�J��q�z�"����
+�
+�D�#�;���Jr/c���00/pCnUH�n[X5upgSnUHn	X�;dM
+[X�U	S-5nM Ub,Xr;a[X�US-5nXs;a[X�US-5nUH!n	[URU	S5U5X9'M# UbX�U'[U5U::a"UR	/5 [U5U::aM"XHR	U5 M� U$)uP並べ替えてよい層。式 (7.1) の Pred に WAR と WAW を足す。
+
+landmark は allocator が使い回す(13 §13 の wire-to-landmark embedding)ので、
+RAW だけでは並べ替えの根拠にならない。定理 21.1 の独立性はワイヤの上の話であり、
+割り当ての後まで自動では届かない。
+rrr)�_regsrd�getr"r&)
+r*�seg�lastw�lastrrgrB�rsr,rirjs
+          r-�
+_layers_hzr|�s����B��#�E�
+���d����
+���A��z����8�a�<�(���
+�=��z����8�a�<�(���z����8�a�<�(���A��5�9�9�Q��+�Q�/�E�H���=��!�H��#�h�!�m��J�J�r�N��#�h�!�m���
+�
+�a��#�$�Jr/c�*�Xup4pVpxn	X4XXXxU	4$rYrF)
+r*�RrBr6r7r8r9r:r;r<s
+          r-�_jobr�s'��"�g��B�1����1�4���r�r�*�*r/c�~�URURURpvn[U5up�n
+[	U5Sp�[U5GHYn
+X�up�nn[
+X5GHnunnU(d�UUSUUSUUSUUS4unnnnU[:XaXeUUU'OLU[:XaUUXeU'O7U[:XaURUUS-5 O[S[U-5eM�[UU5H�nUVs/sHnUUSPM
+ nnUSL=(a5 [	U5U:�=(a  [	[U55[	U5:HnU(aBUR[ UVs/sHn[#XU5PM sn5HunnUUU'M
+ M�UH n[![#XU55unnUUU'M" M� GMq U
+S-UlUcUU:aU	UnGM�SUl gUUunnnnn n!n"U[&:Xa	SUl gU[(:Xa	SUl gU[*:Xa	SUl gU[,:XaUU"-n#O1UUU -UUU!-nnU[.:XaUU:XaOUU:aUU"-OUS-n#SU#s=::aU:aO OU#U	;aU	U#nGMSSUl g [1S	U-5es snfs snf)
+uEblock を層の順に走らせ、幅のある層を pool へ配る。rrrrr1�"直線部分に置けない箱: %sN�*�%block の歩数上限 %d を越えた)r~�M�OUTrbr"r%rtr
+rrr&r$rAr|rL�maprpr�reportrrrrr
+�RuntimeError)$r*�lane�pool�minw�budgetr~r�r��_ent�idx�blrIr8�step�_pcra�termr_�arithrxr6r7rnro�LrB�outs�wide�valrQ�bb�ccr:r;r<�ts$                                    r-�run_lane_parr��s������������#�A��4�L�M�D�r��t�9�a�q��f�
+�� "����4����+�J�E�3��"�3�i��l�D��I�a�L�$�s�)�A�,��S�	�RS��T���A�q�!���8��q�T�7�A�a�D��2�X���d�A��d�G��3�Y��J�J�q��t�c�z�*�$�%I�D�QS�H�%T�U�U����c�*��,-�.�A�q��Q���
+�A��.��D�(�8�S��V�t�^�8���D�	�N�c�$�i�7���"&�(�(�4�A�1N�A�q�$�t��2B�A�1N�"O���3�"��!��#P���!%�d�4�A�&6�!7���3�"��!���+�,�.�Q�h����<��a�x���I����D�K��%)�$�Z�"��B��B��B��
+��8��D�K��
+��8��D�K��
+��:��D�K��
+��9��r�	�A��R�5�B�;��"����q�A�*,��(�q�A�v��Q���r�	�d�Q�h�A���:�A�:�!�s�(��A��A��D�K��g�h�>��G�
+H�H��K/��2Os�J5
+�6J:c��XSXSXSXS4up#pEU[:XaSU4$U[[4;aXE4U4$U[[4;aU4U4$U[
+:XaXE4S4$U[4;aU4S4$U[[4;aXE4S4$g)uJ(読む landmark, 書く landmark)。M と OUT はここに現れない。rrrrrFN)rFN)	rrrr	r
+rrr
+r)r*rBr6r7r8r9s      r-rvrv$s����'�!�*�d�g�a�j�$�'�!�*�d�g�a�j�@�K�B�1�	�S�y��1�u��	�c�3�Z���v�q�y��	�c�2�Y���t�Q�w��	�R�x��v�t�|��	�c�V�|��t�T�z��	�b�"�X�~��v�t�|��r/c�8�US:XaU"U5$SU"U5U4-$�Nrz(%s<<%d)rF)�namerj�ss   r-�_shiftr�6s$���1�f�4��7�;�*��Q���|�";�;r/c	��UcSnXup4pVpxn	U[:Xa
+SU"U5U	4-$U[:Xa'U"U5<S[X%U5<S[X&U5<3$U[:XaU"U5<SU"U5<SU"U5<3$U[:XaU"U5<SU"U5<3$U[
+:XaU"U5<SU"U5<S3$U[:XaS	U"U5<S
+U"U5<3$U[:XaSU"U5-$[S[U-5e)
+Nc��SU-$�N�R[%d]rF�rjs r-�<lambda>�_stmt.<locals>.<lambda><����1�r/z%s=%d�=�+�*z=-z=M[�]zM[�]=zOUT.append(%s&255)r�)
+rrr�rr	r
+rrr$rA)
+r*rBr�r6r7r8r9r:r;r<s
+          r-�_stmtr�:s����|�$��"�g��B�1���	�S�y��$�q�'�2��&�&�	�S�y�!�!�W�f�T�b�&9�6�$�2�;N�O�O�	�S�y�!�!�W�d�1�g�t�A�w�7�7�	�S�y���7�D��G�,�,�	�R�x�!�!�W�d�1�g�.�.�	�R�x�!�!�W�d�1�g�.�.�	�S�y�#�d�1�g�-�-�
+�9�D��H�D�
+E�Er/c�^^�UcSnUcUT:a	STU-/$S[-/$UU4SjnXupxp�p�n
+U[:Xa
+S[-/$U[:Xa
+S[-/$U[
+:Xa
+S[-/$U[:XaSU"X-5-/$U[:XaSOSnS[XYU5U[XZU5U"X-54-SU"US-5-/$)u*block の閉じ。行の並びを返す。c��SU-$r�rFr�s r-r��_tail.<locals>.<lambda>Rr�r/�	return %dc�F>�SUs=::aT:aO OUT;aTU$[$�Nr��R_END�r�r�rIs ��r-�to�_tail.<locals>.toVs"����a��!���S��s�1�v�;�e�;r/�==�<�if %s%s%s: return %dr)	r�r�R_OKr�R_KOrrr
+r�)r*rBr_r�rIr�r�r6rQr8r9r:r;r<�rels   ``          r-�_tailr�Os�����|�$���y�,0�1�H��c�$�i�'�(�O�;��;N�:O�O�<� $�w��B�A�"�"�	�R�x��d�"�#�#�	�R�x��d�"�#�#�	�T�z��e�#�$�$�	�S�y��b���j�(�)�)���(�$��C�"��d�r�"�C����)<�b���j�I�
+J��"�Q��U�)�#�%�%r/c�2^^�UcUT:aTU/$/$UU4SjnXupgp�p�nU[[[4;a/$U[:Xa U"X-54V
+s/sH	o�cMU
+PM sn
+$U"X-5U"US-54V
+s/sH	o�cMU
+PM sn
+$s sn
+fs sn
+f)u0block の後続。_tail の行き先と同じ。c�>>�SUs=::aT:aO OUT;aTU$S$r�rFr�s ��r-r��_succ.<locals>.toms"����a��!���S��s�1�v�:�d�:r/r)rrrr)r*r�r_r�rIr�r6rQrRrSrTrUr<rHs   ``         r-�_succr�hs�����|�"�Q�h��D�	�{�.�B�.�;�$(�:� �B�B�C�b�	�b�"�d�^���	�	�S�y��t�y�M�?�<�?�a��?�<�<��4�9�
+�r�$��(�|�4�F�4�!�A�4�F�F��=��Fs�B�B�<B�Bc
+��^�///penUH�upxp�[5[5smn[U5U	c/OU	/-H>n[X5up�U[U4SjU
+55-nUcM-TRU5 M@ UR	U5 UR	T5 UR	[X	X�U55 M� UVs/sH
+n[5PM nnUVs/sH
+n[5PM nnSnU(axSn[
+[U5S-
+SS5HPn[5nUUHnUUU-nM
+ UUUUU-
+-nUUU:wdUUU:wdMCUUsUU'UU'SnMR U(aMxU$s snfs snf)u�block ごとの live-out(後続が読む landmark の合併)。
+
+block を出た landmark file を読むのは後続 block だけであり、実行台は
+作業領域と OUT しか見ない。だから最後の block の live-out は空になる。
+c3�6># �UHoT;dM
+Uv� M g7frYrF)rGrjr,s  �r-rJ�_liveness.<locals>.<genexpr>�s����1��1�q�j�Q�Q����	�	TFrr)rL�listrvrNr&r�r%r")r*r�r�rI�use�dfs�succrZrar�r_rnrBr{ri�_�live_in�live_out�movedr+�or�r,s                      @r-�	_livenessr�xsy�����R�d�C� "���$��u�c�e���1��d��T�\�r��v�>�A��$�N�E�B�
+��1��1�1�1�A��}����a��	?�
+	�
+�
+�1�
+��
+�
+�1�
+����E�$�d��3�4�!#�!�!�b��s�u�b�G�!�!�"�r�!���r�H�"��E�
+����s�2�w��{�B��+�A���A��!�W���W�Q�Z�����A��!�c�!�f�*�%�A��H�Q�K��1���
+�?�*+�Q�'����W�Q�Z���,��%��O��"��"s�E3�E8c
+�^^^&^'^(^)^*^+�[U5Uc/OU/-n
+0m*0nS/m+SU-/m)U*4Sjm'Sm(U'U(4SjnU)U+4Sjm&U&U(4Sjn
+UGH�nXunnnnnnnU[:Xa[U5T*U'M*U[:XaU
+"U"UU5U"UU5S	S
+5T*U'MSU[:XaU
+"T'"U5T'"U5SS5T*U'MzU[
+:Xa/T'"U5nT("U5nUb[U*5O
+T&"S
+U-5T*U'M�U[:XaVT'"U5nT("U5nUbUU;a
+UUT*U'M�U	bU	RU5 T&"SU-5T*U'UbT*UUU'GMGMU[:XaXT'"U5T'"U5nnT("U5nUbUU;dT)RSU<SU<35 UbUUU'GMbUR5 GMuU[:XaT)RST'"U5-5 GM�[S[U-5e Uc[T*5O
+[T*5U-n[U5H*nT*USU-:wdMT)RSUT*U4-5 M, Uc[!USUTT5nO�XunnnnnnnU["[$4;a�U[":XaSOSnU"UU5U"UU5n nT("U5T("U 5n"n!UU4Sjn#U!b9U"b6U[":XaU!U":HOU!U":n$SU$(aU#"UU-5O
+U#"US-5-/nO/SUUU U#"UU-54-SU#"US-5-/nO[!XUTT5nT)UV%s/sHn%SU%-PM
+ sn%-
+m)T)S/-$s sn%f)u	block ひとつを関数の行へ落とす。
+
+block の中では値を記号で追う(局所の値番号付け)。doc: casm.lane64.vn
+
+  landmark   reg[r] は入口の値 R[r]、即値、または局所変数の名前
+  作業領域   mem[c] は定数番地 c へこの block が書いた値。次の Load はその名前を使う
+
+即値どうしの算術は畳む。commonc の lane64 版はワイヤを語 64 + w に置き、
+一箱が MAT・LD・ST の往復に開くので(back_lane64.cam の覆い)、この追跡で
+往復が消え、綴った数は一つの即値に畳まれる。Store は他の block が読むので残す。
+ただし dead に入った番地への Store は落とす(他のどの block も読まないワイヤ)。
+scan を渡すと文を出さず、この block が読む定数番地のうち、自分の Store より前に
+読むものを scan へ集める(translate の一巡目)。
+意味は式 (2.1) の解釈器が定義であり、test_vcpu.py が両者の一致を確かめる。
+Nrzdef _b%d(R, M, OUT):c�*>�UT;aSU-TU'TU$r�rF)rj�regs �r-rw�_block.<locals>.get�s ����C�<��q�[�C��F��1�v�
+r/c�:�[U5$![a gf=frY)r'r$)rPs r-�lit�_block.<locals>.lit�s"��	��q�6�M���	��	�s�
+
+�
+�c�`>�T"U5nT"U5nUS:XaU$Ub
+[X1-5$SX!4-$r���str)rj�shrProrwr�s    ��r-�shifted�_block.<locals>.shifted�s?�����F����F��
+��7��H��=��q�w�<���Q�G�#�#r/c�d>�TS==S-
+ss'STS-nTRSU<SU<35 U$)Nrrzt%d�    r�)r&)�exprr�r5�tmps  ��r-�fresh�_block.<locals>.fresh�s3����A��!����s�1�v�~���
+�
+�$��-�.��r/c�r>�T"U5T"U5pTUbUb[U"XE55$T"U<U<U<35$rYr�)rH�y�f�sym�vx�vyr�r�s      ��r-�fold2�_block.<locals>.fold2�s;����Q���Q��B�
+�>�b�n��q��y�>�!���C��+�,�,r/c�
+�X-$rYrF�rHr�s  r-r��_block.<locals>.<lambda>�s���r/r�c�
+�X-$rYrFr�s  r-r�r��s���r/r�z-%szM[%s]z    M[r�z    OUT.append(%s&255)r�r�z    R[%d]=%sr�r�c�F>�SUs=::aT:aO OUT;aTU$[$r�r�r�s ��r-r�r��s!���Q�!�Z�a�Z�A��H�3�q�6�G�%�Gr/r�rr�r��)r�rr�rrr	r
+rNrr&�clearrr$rArLrOr�r
+r),r*r+rar�r_r�rI�out_live�dead�scan�steps�memr�r�rBr6r7r8r9r:r;r<rPro�addrr��keeprj�tailrQr�rHr�r�r�r��takenr�r�rwr�r5r�r�s,     ``                               @@@@@@r-�_blockr��sr��� 
+��J���"�4�&�9�E�
+�C�
+�C��#�C�!�A�%�
+&�C��
+�$��-���"&�'���A�q�!�R��R�
+��9���W�C��F�
+�3�Y��7�1�b�>�7�1�b�>�;M�s�S�C��F�
+�3�Y��3�q�6�3�q�6�+=�s�C�C��F�
+�3�Y��A��A��A��A� !�
+�S�!��W�5����3C�C��F�
+�2�X��q�6�D��D�	�A��}��c���Q���A���#��H�H�Q�K��w��~�.��A���=� ��V�C��F�!�
+�2�X��A���A��#�D��D�	�A��$��d���
+�
+�T�3�7�8��}���A���	�	��
+�3�Y��J�J�/�#�a�&�8�9��A�D��H�L�M�M�G�H �'�3�s�8�c�#�h��.A�D�
+�D�\���q�6�W�q�[� ��J�J�~��C��F��3�4���|��T�4��s�A�.��#'�:� ��B��1�b�"�b�
+�"�b��>���(�$��C��1�b�>�7�1�b�>�q�A���V�S��V��B�G�B��~�"�.�&(�B�h��r��R�"�W��#��r�$��)�}�2�d�Q�h�<�P�Q��.�!�S�!�R��r�	�]�1K�K�#�b����l�2�4����T�3��2�D���%��1�F�Q�J��%�%�C��"��:���&s�(Mc�L^�[U5up#n[U5n[XX55nSnUbTUup�[5m[	U5Hun
+up�p�[X
+X�X�XVU
+TS9	 M [U4Sj[
+X�555n/n[	U5Hun
+up�p�U[X
+X�X�XVU
+US9	-
+nM URSSRS[
+[U5555-S-5 [S	5RU5n0n[[US
+S5U5 UUS4$)
+u�image を Python の source と code object へ落とす。
+
+block ひとつが関数ひとつになる。式 (0.1) の B は block を実行した回数であり、
+箱の数ではない。landmark file は block の入口と出口だけで触る(定理 21.1)。
+
+wires = (lo, hi) を渡すと、その区間の語は commonc のワイヤ(語 64 + w、19 §3.3)とみなし、
+他のどの block も読まない Store を落とす。ワイヤは箱の番号で名指しされるので、
+平文の側から計算した番地で読まれることは無い(toolchain が作業領域をワイヤの上に置く)。
+区間の外の語(出口 0..63、作業領域、退避語)は残す。
+N)r�c3�6># �UHoT;dM
+Uv� M g7frYrF)rGr9�reads  �r-rJ�translate.<locals>.<genexpr> s����=�m���}�1�1�m�r�)r�zTAB = (r�c3�,# �UH
+nSU-v� M g7f)z_b%d,NrF)rGr+s  r-rJr$s���$I�.�Q�W�q�[�.�r\�)�
+z<lane64>�exec�TAB)rbr"r�rLr@r�r%r&�join�chrr�compile)r*�wiresr^r�r�rI�liver��lo�hir+rZrar�r_�lines�src�nsrs                  @r-�	translaters����$�<�L�C�b��D�	�A��T�s�&�D��D�������u��)2�2��%�A�%��$��4�D��1�1�g�D�I�*7��=�e�B�m�=�=���E�%.�r�]�!��!�B�d�
+����T���7��N�N��&3�	�L�L��R�W�W�$I�%��B��.�$I�I�I�C�O�P�
+
+�b�'�,�,�u�
+�C�	�B����j�&�	)�2�.���5�	�>�r/c�$�\rSrSrSrSrSrSrg)�Lanei-u\Σ_lane64 の一枚(20 章 式 1.1)。語は Z なので巻き戻さない(§0.3)。c�b�S/[-UlS/U-Ul/UlSUlSUlgr�)�	LANDMARKSr~r�r�r�rb)�self�wordss  r-�__init__�
+Lane.__init__0s1����y������u������������r/c��[[U5[UR5U-
+5nX0RS'X RS'USUURX"U-&U$)u/18 章 §7.1 と同じ置き方(式 8.2)。rrN)�minr"r�)r�data�baserIs    r-�	put_input�Lane.put_input7sR����D�	�3�t�v�v�;��-�.�����q�	����q�	� $�R�a�����t�1�H���r/)r�r�r~rbr�N)�__name__�
+__module__�__qualname__�__firstlineno__�__doc__rr �__static_attributes__rFr/r-rr-s��f��r/rc�h�URURURpTnSn[U5HKnX"X4U5nUS:dMUS-UlU[
+:XaSO
+U[:XaSOSUlURs $ [SU-5e![a [S[U5-5ef=f)uCblock を辿る。式 (0.1) の T_trans がこの loop になる。rrr�NuJ語番号が作業領域を越える(語数 %d)。--words を増やすr�)r~r�r�r%rbr�r�r��
+IndexErrorr"r�)�tabr�r�r~r�r�r8r+s        r-�run_laner+@s������������#�A�	�A�#��v��A���q�S�!�A��1�u��!�e���#$��9�a��d��2�����{�{�"���>��G�
+H�H���#��e��q�6�"�#�	#�#�s�B�6B�?B�"B1c�8�\rSrSrS	SjrSrSrSrS
+SjrSr	g)�InterpiXc�<�XlX l[U5Vs/sH
+nS/[-PM snUl[U5Vs/sH	nS/U-PM snUl[U5Vs/sHn/PM snUlS/U-UlSUlgs snfs snfs snfr�)	r*�Wr%rr~r�r�r�r�)rr*�lanesrr�s     r-r�Interp.__init__Zs����	���+0��<�8�<�a�1�#�	�/�<�8���',�U�|�4�|�!�1�#��+�|�4��� %�e��-��1�B��-����f�u�n�����
+��	9��4��-s�B�B�(Bc��URUn[[U5[U5U-
+5nXTS'X4S'USUXCX5-&U$)Nrr)r�rr")rr�rr�mrIs      r-r �Interp.put_inputcsL���F�F�4�L����D�	�3�q�6�D�=�)���!���!�����8��t�x���r/)rc�t�[UR5Vs/sHo!U-	S-(dMUPM sn$s snf�Nr)r%r/)rr3�ls   r-�_active�Interp._activems*�� ����=�9�=�a�!�V�q�L��=�9�9��9s�5�5c�^�UR[UR5p2SUR-S-
+S4/mT(Ga�U=RS-
+slURU:�a[	SU-5e[T5S:XaTR5upEO3[
+[[T55U4SjS9nTRU5upEUS:XdUS:dXS:�aM�X%upxp�p�n
+US:XaUROURU5nU[:XaM�U[:Xd
+U[:Xa'UHnU[:XaSOSURU'M  GMU[:Xa[TXEU
+-4/5mGM4U[ :Xd
+U[":XarSnUHEnUR$UnUU	U-UU
+U-nnU[ :Xa	UU:XdM4OUU:dM=USU--nMG UU-UU)-nn[TUX]-4UUS-4/5mGM�UH�nUR$UnU[&:XaU
+UU'M#U[(:XaUU	U-UU
+U--UU'MCU[*:XaUU	UU
+-UU'M]U[,:XaUU	*UU'MrU[.:XaUR0UUU	UU'M�U[2:XaUU
+UR0UUU	'M�U[4:XdM�UR6UR9UU	S-5 M� [TXES-4/5mT(aGM�UR$)Nrru歩数上限 %d を越えたc�>�TUS$r6rF)rB�groupss �r-r��Interp.run.<locals>.<lambda>zs
+���&��)�A�,r/)�keyr�r1)r*r"r/r�r��poprr%�_oner8rrrr�r�_merger
+rr~rrrr	r
+r�rrr�r&)rr�r*rI�mskrZr+r6r7r8r9r:r;r<�actr7�cmr~rnro�m1�m0r<s                      @r-�run�
+Interp.runps�����)�)�S����^�a��$�&�&�[�A�%��*�+����J�J�!�O�J��z�z�F�"�"�#A�F�#J�K�K��6�{�a�� �*�*�,���R���c�&�k�*�0F�G�� �*�*�Q�-����a�x�2��6�R�W��&*�h�#�B�1��� #�q��4�9�9�d�l�l�3�.?�C��T�z���R�x�2��8��A�*,��(�Q��D�K�K��N����S�y���#�B�w��(8�9����R�x�2��8����A����q�	�A��Q�4�2�:�q��t�r�z�q�A�#%��8��Q��!�a�%��a�1�f���	�
+�r��3�"��9�B����"�b�g���R�!�V��(E�F������F�F�1�I����9��A�a�D��3�Y��a�D�B�J�1�Q�4�2�:�6�A�a�D��3�Y��Q�4�!�A�$�;�A�a�D��3�Y��a�D�5�A�a�D��2�X��6�6�!�9�Q�q�T�?�A�a�D��2�X�&'��d�D�F�F�1�I�a��d�O��3�Y��H�H�Q�K�&�&�q��t�c�z�2�� �F�c��6�]�O�4�F�c�f�d�{�{�r/)r�r�r~r/r*r�r�N)r�)i@)
+r"r#r$r%rr r@r8rGr'rFr/r-r-r-Xs�����D�:�5r/r-c��U(d'[U5S:XaUSS(a[U5$[U5nUHFup4US:XaM
+[U5HunupgXt:XdMXc-U4X%' M2 URX445 MH U$)uVreconvergence(式 3.3)。pc が同じ組は mask を合わせて一つにする。rr)r"r�r@r&)r<r�r5rBrZr+�m2�p2s        r-rArA�s����c�%�j�A�o�%��(�1�+��E�{��
+�v�,�C�����!�8��$�S�>�K�A�x���x��(�B�����*�
+
+�J�J��y�!���Jr/c�,�[R5 grY)�_Wr�rFr/r-�_worker_initrO�s���H�H�Jr/c
+�:�Uupp4pVn[RU5nUc [[U55SnU[U'/n	[	U5H�n
+[U5nUbUR
+X45 [X�5nSn
+U(aLURSURSp�U(a(U(a![SURX�U-55n
+U	RU[UR5[URSU5X�R45 M� U	$)Nrrc3�*# �UH	oS-v� M g7f�r1NrF�rGros  r-rJ�_worker_run.<locals>.<genexpr>�����H�1G�A�C��1G���)rNrwrr.r%rr r+r�r3r&r�r�rb)rmr)rr�in_base�head�emit�countr*�resr�r��rep�emittedr�lns                r-�_worker_runr_�s���58�2�E�$��U�
+�&�&��-�C�
+�{���u�
+�&�q�)����5�	�
+�C�
+�5�\���E�{�����N�N�4�)��s�!������v�v�a�y�$�&�&��)�"����H�����B�Y�1G�H�H���
+�
+�C��t�x�x��$�t�v�v�e�t�}�*=�w���T�U���Jr/c
+��/n[U5H�n[U5n	UbU	RX45 [X	5n
+SnU(aLU	RSU	RSp�U(a(U
+(a![SU	RX�U
+-55nUR
+U
+[U	R5[U	RSU5UU	R45 M� U$)u�同じ image を lane 何本か分だけ回す。lane の作業領域は式 (1.2) で
+交わらないので、この呼びは互いに独立になる(定理 21.1)。Nrrc3�*# �UH	oS-v� M g7frRrFrSs  r-rJ�_run_share.<locals>.<genexpr>�rUrV)
+r%rr r+r�r3r&r�r�rb)r*rZrrrWrXrYr5r�r�r\r]rr^s              r-�
+_run_sharerc�s���
+�C�
+�5�\���E�{�����N�N�4�)��s�!������v�v�a�y�$�&�&��)�"����H�����B�Y�1G�H�H���
+�
+�C��t�x�x��$�t�v�v�e�t�}�*=�w��K�K�!�	"���Jr/c�N�\rSrSrSrSSjrSrSrSrSr	Sr
+S
+S
+jrSrg	)�VCPUi�ul常駐の実行台。pool を作り直さない(式 0.4)。
+
+lane を配る先は二つある。process は写す量が要るかわりに本当に同時に走る。
+thread は image の翻訳を共有できるので配る費用がほぼ無い。どちらを取るかは
+lane 一本の仕事量で決まるので、両方を持って測れるようにする。
+c��[S[U55Ul[S[U55UlSUlSUl0Ulgr6)rdr'�P�Tr��tpool�_tab)r�procs�threadss   r-r�
+VCPU.__init__�s;���Q��E�
+�#����Q��G��%�����	���
+���	r/c���URb;URR5 URR5 SUlURb"URR	5 SUlggrY)r��closer	ri�shutdown)rs r-ro�
+VCPU.close�sU���9�9� ��I�I�O�O���I�I�N�N���D�I��:�:�!��J�J���!��D�J�"r/c��URc7URS:�a'SSKnURUR[S9UlUR$)Nrr)�initializer)r�rg�multiprocessing�PoolrO)r�mps  r-�_ensure�VCPU._ensures;���9�9�����!��(�������L��A�D�I��y�y�r/c��URcfURS:�aVSSKJn U"UR5Ul[	URRS[
+UR555 UR$)u[立ち上げたら畳まない。次の run は待機中の worker がそのまま拾う。rr)�ThreadPoolExecutorc��grYrF)r�s r-r��VCPU._threads.<locals>.<lambda>s��$r/)rirh�concurrent.futuresrzr�r�r%)rrzs  r-�_threads�
+VCPU._threads
+sR���:�:��$�&�&�1�*�=�+�D�F�F�3�D�J���������d�f�f�
+�>�?��z�z�r/c�p^^�UU4Sj[T55Vs/sHnU(dMUPM sn$s snf)Nc3�J># �UHnTT-UTT-:aSOS-v� M g7f)rrNrF)rGr+r0rIs  ��r-rJ�VCPU._shares.<locals>.<genexpr>s-����/�%-��"�Q�J�q�5�1�9�}�!�!�D�%-�s� #)r%)rr0rIr9s `` r-�_shares�VCPU._sharess=���/�%*�1�X�/�5�/�a�23��/�5�	5��5s�3�3c��URRU5nUc%[[U55SnX RU'U$r6)rjrwrr.)rr)r*s   r-�_table�VCPU._tables=���i�i�m�m�E�"���;��F�5�M�*�1�-�C�"�I�I�e���
+r/Nc
+��US:�a�URS:�a�URU5nURX R5V	s/sH*n	UR5R	[
+X�X4XVU5PM, n
+n	/nU
+H"nUR
+UR55 M$ U$URS::dUS:Xa[URU5X#XEXg5$URX R5V	s/sH	n	XXEXgU	4PM n
+n	/nUR5R[U
+5HnUR
+U5 M U$s sn	fs sn	f)ulane を P 本の process へ均等に配る。返りは lane ごとの組になる。
+
+組は (報告, Put の byte 列, 先頭 head 語, 取り出した image, block 数)。
+作業領域まるごとを持ち帰らないのは、process 間で写す量を抑えるためになる。
+r)rhr�r�r~�submitrc�extend�resultrgrwr�r_)rr)r0rrrWrXrYr*r9�futsr[r��jobs�parts               r-rG�VCPU.run s<���1�9����!���+�+�e�$�C�"�\�\�%���8�:�8���M�M�O�*�*�:�s�u�+2�$�@�8�
+�:��C����
+�
+�1�8�8�:�&���J��6�6�Q�;�%�1�*��d�k�k�%�0�%��"�*�
+*����e�V�V�4�6�4�A��t�d�!�<�4�	
+�6����L�L�N�&�&�{�D�9�D��J�J�t��:��
+��:��6s�1E�4E)rgrhrjr�ri)rr)rrIN�@r�F)
+r"r#r$r%r&rrorwr~r�r�rGr'rFr/r-rere�s4�������5��BD��r/rec�B�[RRS5 g)Nu�vcpu <image.bin> [option]
+  --lanes W    lane 数。既定 1(20 章 式 1.1)
+  --words S    lane あたりの語数。既定 4096
+  --procs P    lane を配る process の本数。既定 1
+  --in F       全 lane の作業領域へ F を写す。語 0 が byte 数、語 1 が基底
+  --in-base B  本文の基底語番号。既定 64
+  --dump N     復帰後に語 0..N-1 を出す
+  --emit F     lane 0 が組んだ image を取り出す(19 章 §3.1)
+  --interp     式 (2.1) の mask 付き解釈器で走らせる
+  --cupy       語も述語も bit のまま GPU で走らせる(cuvcpu)
+  --bits NB    --cupy の語の幅。既定 32
+  --list       image を逆アセンブルして並べる
+  --source     翻訳した Python を出す
+)�sys�stderr�writerFr/r-�_usager�=s���J�J���	9�
+:r/c��[U5S:a[5 gUSnSup#pEpgSnSn	S=p�S=n=n
+=p�SnU[U5:a�UUnUS;aUUS-
+n[UU5nUS:XaUnO�US	:XaUnO�US
+:XaUnOxUS:XaUnOoUS:XaUnOfUS
+:XaUn	O]US:XaUnOTUnOQUS:XaUS-
+nUUn
+O@US:XaUS-
+nUUnO/US:XaSnO&US:XaSn
+OUS:XaSnOUS:XaSnO[5 gUS-
+nU[U5:aM�[US5nUR	5nSSS5 [W5nU(a[
+U5Hn[U5 M gU(a[[U5S5 gSnU
+b%[U
+S5nUR	5nSSS5 [R"5nU
+(a�[UX#S9nUb%[U5HnURUUU5 M UR5n[U5Vs/sH=nUU[UR U5UR"US[%US5SS4PM? nnSUR&-nGOLU(a4SSKnURUX#U	UU[%US5USLS9nSU	USS4-nGOU(a�SSKnSn UR-U5n![/U5n"UbU"RUU5 [1UU"U!5nU!R35 U!R55 U[U"R 5[7U"R"S[%US55SU"R84/nSU"R8-nA OP[;XG5n#U#RUX#UU[%US5USLS9nU#R35 S[=S U55-n[R"5U-
+n$Sn%[?U5HPununn&n'n(n)US:XaS!O	US":XaS#OS$n*US:waU%S-
+n%US%::dUS:dUUS-
+:XdM@[S&UU*4-5 MR [S'UU$X$U4-5 USun+n,n-n.n/U,(a([S([U,5U,RS)54-5 [U5HLn0U-U0nURA5S*:�a [S+U0URA54-5 M<[S,U0U4-5 MN UbmU.c+[BRDRGS-U-SU-S4-5 g[US.5nURGU.5 SSS5 [S/U[U.54-5 U%(aS$S$!,(df   GN1=f!,(df   GN�=fs snf!,(df   N[=f)0Nrr)rrIrrr�rr� F)�--lanes�--words�--procs�--dumpz	--in-base�	--threads�--par�--bitsr�r�r�r�r�r�r�z--inz--emitz--listTz--interpz--cupyz--source�rb)r0rru解釈器 %d 歩r)r0r�bitsrrWrXrYuGPU %d bit  %d 歩u層並列 block %d 回)r0rrrWrXrYu翻訳器 block %d 回c3�*# �UH	oSv� M g7f)rNrF)rGrjs  r-rJ�main.<locals>.<genexpr>�s���-@�C�q��d�C�rV�tur��teu報告なしrzlane %-4d %su0%s   %.3f 秒   lane %d   process %d   thread %dzout    : %d byte  %szlatin-1rIu  w[%d] = %d bit の整数z  w[%d] = %du"image が空(語1=%d 語2=%d)
+�wbzimage  : %s  %d byte)$r"r�r'�openrr.rC�printr�time�perf_counterr-r%r rGr3r�r�rdr��cuvcpurtrurr�ror	r�rbre�sumr@�
+bit_lengthr�r�r�)1�argv�img_pathr0rrk�dumprWrl�parr��in_path�	emit_path�listing�interp�source�cupyrBr7ror�r)r*r^r�t0r3r7r\r[�noter�rvr*r�r��vm�el�badr5rX�_emrR�tag�rep0�out0�head0�em0r�r+s1                                                 r-�mainr�Ns���
+�4�y�1�}�����A�w�H�2F�/�E�%�w�
+�C�
+�D���G�',�,�G�,�f�,�v�	�A�
+�c�$�i�-���G���1�1�
+��F�A��D��G��A��I�~����i�����i�����k�!����g�����h�����h������
+�&�[�
+��F�A��1�g�G�
+�(�]�
+��F�A��Q��I�
+�(�]��G�
+�*�_��F�
+�(�]��D�
+�*�_��F��H��	�Q���O�c�$�i�-�R
+�h��	�������
+��%�=�D����,�B��"�I���
+�
+�i��o�a� �!���D���
+�'�4�
+ �A��6�6�8�D�!�
+�	�	�	�B�
+��4�u�2�����5�\�����A�t�W�-�"��e�e�g���e��&�$�1��A���a�e�e�A�h�����Q��
+��T�1��)>��a�H�$�	�&�!�A�G�G�+��	
+���j�j��U�d��!(�s�4��|�'�t�3��5��$�t�S��V�A�Y�&7�7��	�$����w�w�s�|���E�{�����N�N�4��)��4��t�,���
+�
+���	�	���U�4�8�8�_�d�4�6�6�-�3�t�Q�<�+@�&A�4�������'�$�+�+�5���
+�%�
+!���f�f�U�%�4�$�3�t�Q�<�i�t�>S��U��
+���
+�'�#�-@�C�-@�*@�@��	
+�	�	�	�r�	!�B�
+�C�(1�#��$��$�C��d�C���Q�h�d�S�B�Y�T�N���!�8��1�H�C��A�:��Q��!�u�q�y�.��.�A�s�8�+�,�)7�
+�
+<�
+�2�u�W�-�.�/�!$�A���D�$��s�A��
+�$��D�	�4�;�;�y�3I�'J�J�K�
+�4�[���!�H���<�<�>�D� ��.�!�Q�\�\�^�1D�D�E��.�A�q�6�)�*�
+����;��J�J���B�e�A�h�PU�VW�PX�EY�Y�Z��
+�)�T�
+"�a�
+�G�G�C�L�#�
+�$�	�3�s�8�'<�<�=��1����e
+�	��!�
+ ��&�n#�
+"�s+�U�U%�AU7�U<�
+U"�%
+U4�<
+V
+�__main__)Nr�rY)NNN)r�)=r&�osr�r�r#r%rrrrr	r
+rrr
+rrrrrA�	frozensetrMr�r�r�rr.r=rCrVrbrkrrrprtr|rr�rvr�r�r�r�r�r�r�objectrr+r-rArNrOr_rcrer�r�r"�exitr�rFr/r-�<module>r�sh��
+�
+�
+��	��=B�2�Y�:��c�3��S�"�b�#�r�2�r�2�s�'���"�b�#�r�2�t�,�-�����d�E��	�
+�"��	.�?�*�V
+�C��c�3�'�	(��=�
+� �:+�
+9I�T�$<�F�*%�2
+G� �Bp�f�B�6��&I�0M�V�M�`�,����.�&I�6�I�\:�"F�R�z���H�H�T�#�(�(�^��r/
\ No newline at end of file
Index: trunk/runtime/__pycache__/vcpu_vec.cpython-313.pyc
===================================================================
trunk/runtime/__pycache__/vcpu_vec.cpython-313.pyc
new file mode 100644
--- a/trunk/runtime/__pycache__/vcpu_vec.cpython-313.pyc	(nonexistent)
+++ b/trunk/runtime/__pycache__/vcpu_vec.cpython-313.pyc	(revision 2)
@@ -0,0 +1,187 @@
+�
+
+z�jt6����SrSSKrSSKrSSKJrJrJrJrJrJ	r	J
+r
+JrJrJ
+r
+JrJrJrJrJrJrJrJrJr Sr"SS\5rSrS
+SjrSS	jr\"S5rS
+rSSjr SSjr!g)urlane64 の三本めの道。W 枚の lane を numpy の配列に束ね、block を一度に走らせる。
+
+doc: casm.lane64.sem casm.lane64.merge casm.lane64.cost casm.simd
+
+    解釈器   vcpu.Interp     式 (2.1) の mask 付き意味。これが定義になる
+    翻訳器   vcpu.run_lane   block を Python の code object へ落とす。一枚
+    束ね     ここ            同じ block を走る lane を配列の一次元に並べる
+
+命題 6.1 が束ねの根拠になる。lane の作業領域は式 (1.2) で交わらないので、
+(mask, pc) の組を pc 昇順に進める観測は、lane を一本ずつ走らせた観測に一致する。
+だから組を「lane の添字」で持ってよく、mask の bit 演算は要らない。
+
+20 章 §0.4 は「大整数の欄へ W 個を詰める」形を退けている。乗算が欄をまたいで
+畳み込み、LD と ST は lane ごとに番地が違うためになる。配列はその制限を受けない。
+gather と scatter が LD と ST をそのまま運ぶので、頭打ちの式 (0.3) は効かない。
+
+実測(CPython 3.12 + numpy 2.5、一 lane あたり ns)
+
+    種      list   W=256   W=1024      倍
+    ADD     37.3    3.54     1.43     26
+    MUL     35.5    3.48     1.44     25
+    LD 定   26.9    1.46     0.54     50      番地が定数。M の行がそのまま連続になる
+    ST 定   28.9    1.56     0.53     55
+    LD 変   26.9   10.21     5.87      4.6    番地がワイヤの値。gather になる
+    ST 変   28.9    8.56     4.94      5.9
+    比較    30.8    3.17     1.18     26
+
+作業領域は (語数, W) に取る。(W, 語数) では定数番地が stride になり、可変番地の
+gather も遅くなる(W=1024 で 5.95 対 7.80 ns)。
+
+    重さ = 語数 x W x 8 byte。W=256 で 語数 70000 なら 143 MB
+
+語は Z(多倍長)が仕様(§0.3)だが、配列は int64 になる。だから `overflow` が
+溢れを見る。溢れたら翻訳器の道へ落とす。証とソルバーの語は在庫・金・手数・
+区画の番号なので 2^62 に遠く及ばない。commonc の compile はここへ載せない。
+�N)�ADD�EQ�HALT�JMP�KO�LD�LT�MAT�MUL�NEG�OK�PUT�ST�	LANDMARKS�NAME�R_END�R_KO�R_OK�blockslc�0�\rSrSrSrSrSrSrSrSr	g)	�LaneVec�0u�W 枚の lane(式 1.1 の Σ_lane64 を W 本)。
+
+R[a] が landmark a の lane 方向のベクトル、M[c] が語 c の lane 方向のベクトルになる。
+どちらも第一軸が番号なので、定数番地は連続した W 語になる。
+c�~�Xl[R"[U4[RS9Ul[R"X!4[RS9Ul[R"U[RS9Ul[U5Vs/sHn/PM snUl
+S/U-UlSUlgs snf)N��dtyper)
+�W�np�zerosr�int64�R�M�arange�ix�range�OUT�reportr)�self�width�words�_s    �runtime/vcpu_vec.py�__init__�LaneVec.__init__7s��������9�e�,�B�H�H�=������5�.����9����)�)�E����2��� %�e��-��1�B��-����f�u�n�������.s�B:c� �X RU'g)ua語 addr へ lane ごとの値を置く。put_input と違い、こちらは一語だけ動かすN)r!)r'�addr�valuess   r+�seed�LaneVec.seed@s
+�����t��c��[[U5URRSU-
+5nX0RS'X RS'[R
+"USU[RS9SS2S4URX"U-&U$)uP18 章 §7.1 と同じ置き方(式 8.2)。全 lane へ同じ入力を配るr�Nr)�min�lenr!�shaper�asarrayr)r'�data�base�ns    r+�	put_input�LaneVec.put_inputDsn����D�	�4�6�6�<�<��?�T�1�2�����q�	����q�	� "�
+�
+�4���8�2�8�8� D�Q��W� M����t�1�H���r3c���[[R"UR5R	5[
+:�=(d5 [R"UR5R	5[
+:�5$)uBint64 の巻き戻しを疑う語があるか。無ければ False)�boolr�absr �max�GUARDr!)r's r+�overflow�LaneVec.overflowLsF���B�F�F�4�6�6�N�&�&�(�E�1�R�R�V�V�D�F�F�^�5G�5G�5I�U�5R�S�Sr3)r!r%r rrr#r&N)
+�__name__�
+__module__�__qualname__�__firstlineno__�__doc__r,r1r=rD�__static_attributes__�r3r+rr0s������Tr3rc�f�UR5(aU$UR5(dU$XU4$�N)�all�any)�cond�yes�nos   r+�_brrT[s,���x�x�z�z��
+��8�8�:�:��	��r�?�r3c
+�`^^^(^)^*^+^,^-�[U5Uc/OU/-n
+00S/sm,nm-SU-/m+Sn[U5Hup�XS[:XdMU
+nM U,4Sjm)Sm*U)U*4SjnU+U-4Sjm(U(U*4Sjn[U5GH�unnUUunnnnnnnU[:Xa[	U5T,U'M.U[
+:XaU"U"UU5U"UU5S	S
+5T,U'MWU[:XaU"T)"U5T)"U5SS5T,U'M~U[:Xa/T)"U5nT*"U5nUb[	U*5O
+T("S
+U-5T,U'M�U[:XafT)"U5nT*"U5nUbUU;a
+UUT,U'M�U	bU	RU5 T("Ub
+UU:aSOSU-OSU-5T,U'UbT,UUU'GM$GM'U[:XaeT)"U5T)"U5nnT*"U5nUbUU;d&T+RUb
+SU<SU<3O	SU<SU<35 UbUUU'GM�UR5 GM�U[:Xa.T+RST)"U5-5 T+RS5 GM�[S[U-5e Uc[T,5O
+[T,5U-n[!U5H*nT,USU-:wdMT+RSUT,U4-5 M, UU4Sjn Uc%T+RSUT:aTUO["-5 GODXunn!nnnnnU[$:XaT+RS[&-5 GOU[(:XaT+RS[*-5 O�U[,4;aT+RS["-5 O�U[.:XaT+RSU "UU-5-5 O�U"UU5U"UU5n#n"T*"U"5T*"U#5n%n$U$bGU%bDU[0:XaU$U%:HOU$U%:n&T+RSU&(aU "UU-5O
+U "US-5-5 O9U[0:XaSOSn'T+RSU"U'U#U "UU-5U "US-54-5 T+S/-$) Nrzdef _v%d(R, M, OUT, ixs, s):�����c�*>�UT;aSU-TU'TU$)N�R[%d][s]rL)�r�regs �r+�get�_block_vec.<locals>.get�s ����C�<��!�^�C��F��1�v�
+r3c�:�[U5$![a gf=frN)�int�
+ValueError)�es r+�lit�_block_vec.<locals>.lit�s"��	��q�6�M���	��	�s�
+
+�
+�c�`>�T"U5nT"U5nUS:XaU$Ub
+[X1-5$SX!4-$)Nrz(%s<<%d)��str)rY�shr`�vr[ras    ��r+�shifted�_block_vec.<locals>.shifted�s?�����F����F��
+��7��H��=��q�w�<���Q�G�#�#r3c�d>�TS==S-
+ss'STS-nTRSU<SU<35 U$)Nrr5zt%dz    �=)�append)�expr�name�out�tmps  ��r+�fresh�_block_vec.<locals>.fresh�s3����A��!����s�1�v�~���
+�
+�$��-�.��r3c�r>�T"U5T"U5pTUbUb[U"XE55$T"U<U<U<35$rNrd)�x�y�f�sym�vx�vyrqras      ��r+�fold2�_block_vec.<locals>.fold2�s;����Q���Q��B�
+�>�b�n��q��y�>�!���C��+�,�,r3c�
+�X-$rNrL�rtrus  r+�<lambda>�_block_vec.<locals>.<lambda>�s���r3�+c�
+�X-$rNrLr}s  r+r~r�s���r3�*z-%szM[%s][s].copy()zM[%s][s]z	M[%s,ixs]z    M[z][s]=z,ixs]=z	    _o=%szH    for _p in range(len(ixs)): OUT[int(ixs[_p])].append(int(_o[_p])&255)u"直線部分に置けない箱: %srXz    R[%d][s]=%sc�F>�SUs=::aT:aO OUT;aTU$[$)Nr)r)�t�idxr<s ��r+�to�_block_vec.<locals>.to�s"����a��!���S��s�1�v�;�e�;r3z
+    return %dr5z==�<z    return _br(%s%s%s,%d,%d)�)�list�	enumeraterr
+rerrrr�addrl�clearrr_r�set�sortedrr
+rrrrrr).�prog�k�body�term�stopr�r<�out_live�dead�scan�steps�mem�last_st�_p�_irhrz�pos�i�op�a�b�c�sb�sc�imr`rgr/�val�keeprYr��_artrurxry�taken�relrqr[rarorZrps.     ``                                 @@@@@@r+�
+_block_vecr�ls �����J���"�4�&�9�E���Q�C�M�C��c�)�A�-�
+.�C��G��D�/����8�A�;�"���G�"��
+�$��-��D�/���Q�"&�q�'���A�q�!�R��R�
+��9���W�C��F�
+�3�Y��7�1�b�>�7�1�b�>�;M�s�S�C��F�
+�3�Y��3�q�6�3�q�6�+=�s�C�C��F�
+�3�Y��A��A��A��A� !�
+�S�!��W�5����3C�C��F�
+�2�X��q�6�D��D�	�A��}��c���Q���A���#��H�H�Q�K��"#�-�69�7�]� 1�
+�VZ�Z�5@�4�5G�I��A���=� ��V�C��F�!�
+�2�X��A���A��#�D��D�	�A��$��d���
+�
+�a�m��c�:�m�6:�C� @�B��}���A���	�	��
+�3�Y�
+�J�J�{�S��V�+�,��J�J�a�b��A�D��H�L�M�M�Q"�T �'�3�s�8�c�#�h��.A�D�
+�D�\���q�6�Z�!�^�#��J�J�(�A�s�1�v�;�6�7��<��|��
+�
+�?�4�!�8�c�$�i��G�H�#'�:� ��B��1�b�"�b�
+��8��J�J���-�.�
+�2�X��J�J���-�.�
+�D�7�]��J�J���.�/�
+�3�Y��J�J���D�2�I��6�7��1�b�>�7�1�b�>�q�A���V�S��V��B��~�"�.�&(�B�h��r��R�"�W���
+�
+�?�u�b����m�"�T�TU�X�,�W�X� �B�h�d�C���
+�
+�9�Q��Q��4�RT�9�
+�WY�Z^�ab�Zb�Wc�<d�d�e��"��:�r3c�x^�[U5up#n[U5n[R"XX55nSnUbTUup�[	5m[U5Hun
+up�p�[
+X
+X�X�XVU
+TS9	 M [	U4Sj[X�555n/n[U5Hun
+up�p�U[
+X
+X�X�XVU
+US9	-
+nM URSSRS[[U5555-S-5 [S	5RU5n[[S
+.n[[USS5U5 UUS
+4$)u�image を numpy の block 関数の表へ落とす。引数は vcpu.translate と同じ意味になる。
+
+wires = (lo, hi) はワイヤの区間。他のどの block も読まない Store を落とす。
+N)r�c3�6># �UHoT;dM
+Uv� M g7frNrL)�.0r��reads  �r+�	<genexpr>�translate.<locals>.<genexpr>�s����=�m���}�1�1�m�s�	�	)r�zTAB = (r�c3�,# �UH
+nSU-v� M g7f)z_v%d,NrL)r�r�s  r+r�r��s���$I�.�Q�W�q�[�.�s��)�
+)rTrz<lane64-vec>�exec�TAB)rr7�vcpu�	_livenessr�r�r�r$rl�join�chrrTrr��compile)r��wires�entr��blr<�liver��lo�hir��pcr�r�r��lines�src�nsr�s                  @r+�	translater��s&���
+�$�<�L�C�b��D�	�A��>�>�$�C�+�D��D�������u��)2�2��%�A�%��$��t��D�q�q�'��M�*7��=�e�B�m�=�=���E�%.�r�]�!��!�B�d�
+��D�T��A�A�w�T�R�R��&3�	�L�L��R�W�W�$I�%��B��.�$I�I�I�C�O�P�
+
+�b�'�,�,�u�
+�C��B�	�B����n�f�	-�r�2���5�	�>�r3c���UHmup#[U5HGunupVXc:XdMU[Ld	U[La[U4X'O[R"XR5U4X' MY UR	X#45 Mo U$)uG同じ block 番号の組を合わせる(式 3.3 の reconvergence))r��_ALLr�union1drl)�groupsrq�selr�r��s2�b2s       r+�_joinr�so�����$�V�,�K�A�x���w���:����!%�q�	�F�I�!#���B�!4�a� 8�F�I��
+-�
+�M�M�3�(�#���Mr3c�^�URURURUR4up4pV[S4/mSnT(Ga5US-
+nXr:�a[SU-5e[
+T5S:XaSO[[[
+T55U4SjS9nTRU5up�U	[LaUOXinX
+"X4X[U	5n[U[5(a/Uup�nU	[LaUOXin[TUU
+U4UU
+)U4/5mM�US:�a[TX�4/5mM�U[:XaSO
+U[:XaSOSnU	[LaU/UR-UlO!U	HnUUR [#U5'M T(aGM5XqlUR $)u�W 枚を束ねて走らせる。返りは lane ごとの報告の列。
+
+報告は翻訳器と同じ値を使う。0 が tu、42 が te、None が停止になる。
+rr5u"組の歩数上限 %d を越えたc�>�TUS$)Nr5rL)r�r�s �r+r~�run.<locals>.<lambda>+s���V�TU�Y�WX�\r3)�key�*N)r r!r%r#r��RuntimeErrorr7r6r$�pop�
+isinstance�tupler�rrrr&r^r)�tab�lv�budgetr r!r%r#r�r�r�r��ixsrYrQrRrSr;�rep�lr�s                   @r+�runr�sr���
+�D�D�"�$�$�������-�M�A�#��Q�i�[�F�
+�E�
+�
+��
+���>��C�f�L�M�M��V���!�A�s�5��V��+=�CY�'Z�����A�����4�K�b�R�W���F�1��3�'���a�����M�D�r����2�"�'�D��6�T�$�Z��$5��d�U��R�7H�#I�J�F����6��6�S�H�:�.�F����9�a��d��2����$�;�������B�I���$'��	�	�#�a�&�!��+�&�.�I�
+�9�9�r3c��[R"U5n[U5n[Xb5n[	U5H-up�U	R5Hup�X�RX�4'M M/ [XS(aSU4OSS9up�[[X�55n[U5VV
+s/sH,o�V
+s/sHn
+[URX�45PM sn
+PM. nnn
+[R"XS(aSU4OSS9unn//nnUH�n	[R"U5nU	R5Hup�UURU
+'M UR"UU55 URUV
+s/sHn
+URU
+PM sn
+5 M� UU:H=(a! UU:H=(a UR5(+nUUU4$s sn
+fs sn
+nfs sn
+f)u#束ねの道と翻訳器の道が同じ観測を返すか。
+
+命題 6.1 の最後が「二つの観測が一致することが、この package の検査の一つになる」
+と言う。seeds は lane ごとの {番地: 値}。返りは (合うか, 束ねの報告, 翻訳器の報告)。
+�@N)r�)r��decoder7rr��itemsr!r�r�r�r$r^�Lanerl�run_lanerD)�image�seedsr)�need�watchr�rr�r��sr�rg�_src�tabv�rep_v�val_v�_src2r��rep_s�val_s�lane�oks                      r+�agreesr�Cs����;�;�u��D��E�
+�A�	��	�B��%� ����G�G�I�D�A��D�D���J��!��4�T��D�z�t�D�J�D���T���E�7<�Q�x�@�x�!�u�
+-�u�!�c�"�$�$�q�t�*�o�u�
+-�x�E�@�����$�R��J�D�I�J�E�3��r�5�E�
+���y�y�����G�G�I�D�A��D�F�F�1�I��
+���T�]�]�3��-�.�
+����/��A�d�f�f�Q�i��/�0���5�.�
+A�U�e�^�
+A�B�K�K�M�0A�B�
+�u�e����.��@��0s�!	G�*#G�
+G�5G
+�G)NNNrN)l)NrL)"rJ�numpyrr�rrrrrrr	r
+rrr
+rrrrrrrrrC�objectrrTr�r��slicer�r�r�r�rLr3r+�<module>r�st��#�J��>�>�>�>�>�>�	��T�f�T�V�"{�|�D
+�T�{��� �Jr3
\ No newline at end of file
Index: trunk/runtime/anf.bin
===================================================================
trunk/runtime/anf.bin
new file mode 100644
--- a/trunk/runtime/anf.bin	(nonexistent)
+++ b/trunk/runtime/anf.bin	(revision 2)
@@ -0,0 +1,30 @@
+@	@@A	AAB	BBC	CCD	DDE	EEF	FFG	GGH	HHI	IIJ	JJK	KKL	LLM	MMN	NNO	OOP	Q	R	RRS	SST	TTU	UUV	VVW	WWX	XXY	YYZ	ZZ[	[[\	\\]	]]^	^^_	__`	a	`ab	bbc	d	cde	eef	fQ	h	hhi	hij	k	kkl	llm	mmn	nno	oop	ppq	qqr	rrs	sst	ttu	uuv	vvw	x	wxy	yyz	zz{	{{|	||}	}j		�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	���	��	�	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	��	�	 �	�	��	��		�	�		��������							
+	
+
+		
+	
+
+																		 	  !	!!"	""#	##$	$$%	%%&	'	&'(	(()	))*	**+	,	+,-	--.	.	0	001	112	223	334	445	556	667	778	889	99:	;	:;<	<<=	==>	>>?	??@	@@A	AAB	C	CCD	DDE	EEF	FFG	GGH	HHI	IIJ	JJK	KKL	LLM	MMN	NNO	P	OPQ	QQR	RRS	SST	U	TUV	VVW	WX	XBY	YZ	[	[[\	\\]	^	]^_	__`	``a	aab	c	bcd	dde	f	efg	ggh	i	hij	jjk	l	klm	mmn	o	nop	ppq	qqr	rrs	t	stu	uuv	vvw	wwx	xxy	yyz	zz{	|	||}	}}~	~~	�	���	���	���	���	���	���	���	���	�	���	���	���	���	�	���	���	��	�{�	�Z	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	�	���	���	��	�	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	��	�	 �	�	��	��	�	��	��	�	��+��������	�	���	���	���	���	���	���	��											
+		
+		
+	
+		�																 	!	 !"	""#	##$	$$%	%%&	&	(	(()	()*	+	++,	,,-	--.	../	//0	001	112	223	334	445	556	667	8	789	99:	::;	<	;<=	==>	?	>?@	@@A	B	ABC	C*	E	EEF	EFG	H	HHI	IIJ	JJK	KKL	LLM	MMN	NNO	OOP	PPQ	QQR	RRS	SST	U	TUV	VVW	X	WXY	YYZ	ZZ[	[[\	\G	^	^^_	__`	a	`ab	bbc	ccd	dde	f	efg	ggh	i	hij	jjk	l	klm	mmn	o	nop	ppq	r	qrs	sst	ttu	uuv	w	vwx	xxy	yyz	zz{	{{|	||}	}}~		�	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	�	���	���	�	���	��	�~�	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	�	���	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	���	���	��	���	��	�	���	���	�	���	���	���	���	�	���	���	�	���	���	�	���	���	�	���	���	�	���	���	���	���	�	���	���	���	���	���	���	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���		�					�							
+	
+
+		
+	
+
+																	�	 	  !	!!"	""#	##$	$$%	%%&	&&'	''(	(()	))*	**+	++,	-	,-.	../	//0	001	2	123	334	5	456	6	8	889	99:	;	:;<	<<=	==>	>>?	@	?@A	AAB	C	BCD	DDE	F	EFG	GGH	I	HIJ	JJK	L	KLM	MMN	NNO	OOP	Q	PQR	RRS	SST	TTU	UUV	VVW	WWX	Y	YYZ	ZZ[	[[\	\\]	]]^	^^_	__`	``a	aab	bbc	ccd	dde	f	efg	ggh	hhi	j	ijk	kkl	m	lmn	nno	p	opq	qr	rXs	t	ttu	uuv	vvw	wwx	xxy	yyz	zz{	{{|	||}	}}~	~~	�	�	���	���	���	�	���	���	�	���	���	��	�s�	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	���	���	��	���	��	�	���	���	�	���	���	���	���	�	���	���	�	���	���	�	���	���	�	���	���	�	���	���	���	���	�	���	���	���	���	���	���	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	�	���	���	�	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	���	���	��	���	��	���	�	���	���	���	���	���	��													
+	
+
+		
+	
+
+						�												 	 !	!!"	#	"#$	$$%	&	%&'	''(	)	()*	**+	++,	,,-	.	-./	//0	001	112	223	334	445	6	667	778	889	99:	::;	;;<	<<=	==>	>>?	??@	@@A	AAB	C	BCD	DDE	EEF	G	FGH	HHI	J	IJK	KKL	M	LMN	NO	O5P	Q	QQR	RRS	SST	TTU	UUV	VVW	WWX	XXY	YYZ	ZZ[	[[\	\\]	^	]^_	__`	``a	b	abc	ccd	e	def	ffg	gh	hPi	j	jjk	kkl	llm	mmn	nno	oop	ppq	qqr	rrs	sst	ttu	uuv	w	vwx	xxy	z	yz{	{{|	||}	}}~	~	i�	�	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	���	���	��	�	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	�	���	���	��	�	 �	�	��	��	�	��	��	�	��Q��������	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	�	���	���	�	��													
+	
+
+		
+	
+
+																		 	  !	!!"	""#	##$	$$%	%%&	&&'	''(	)	()*	**+	++,	-	,-.	../	0	/01	112	3	234	4	6	667	778	889	99:	::;	;;<	<<=	==>	>>?	??@	@@A	AAB	C	BCD	DDE	EEF	G	FGH	HHI	J	IJK	KKL	M	LMN	NO	P	PPQ	QQR	RRS	SST	TTU	UUV	VVW	WWX	XXY	YYZ	ZZ[	[[\	\\]	]]^	_	^_`	``a	b	abc	ccd	de	f	 g	h	gh	Oe	k	gk	gm	n	mn|�������p	ppq	qqr	rrs	sst	ttu	uuv	vvw	wwx	xxy	yyz	zz{	{{|	}	|}~	~~	�	�	���	���	�	���	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	���	��	�	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	��	�	 �	�	��	��	�	��	��	�	��h�������
+
\ No newline at end of file
Index: trunk/runtime/commonc_lane64.bin
===================================================================
trunk/runtime/commonc_lane64.bin
new file mode 100644
--- a/trunk/runtime/commonc_lane64.bin	(nonexistent)
+++ b/trunk/runtime/commonc_lane64.bin	(revision 2)
@@ -0,0 +1,150 @@
+
+P		
+	
+
+ "$&(*,.0246
+ !"
+#$%&	%&%	%&%	%&%		%&%
+	%&%	%&%	%&%	%&%.	%&%<	%&%^	%&%a	%&%�	%&%�	%&%�	%&%�	%&%�&	%&%�&	%&%�&	%&%�&	%&%�&	%&%�&	%&%�&	%&%�&	%&%�&	%&%�&	%&%�&	%&%�&	%&%�&	%&%�&	%&%�&	%&%�&	%&%%%%&&&%&%%%&&&&�&&%&'�(((	'(''%''(	('%&%	'%	%
+'%J%%a'%T%{'%XQ%�%%&&&%%%&%&%&�&%&�&�'	&'&�	&%%�	%'%�%%&%& &�'&(G''((�((%(	&'%�%%&�&&%%&&%&%%%&%%&&�'&(G''(%'%	&%%�&%'&&'	%&��������%�%%&&&%'�''	&'& %&%&&&	%&%�&%'!''&(((	'('&&'	%&%�	%(%&%'&&'	%&�%%%&k%&&s%&&t%& &n%&"&h%&$&m%&&&y%&(&r%&*&w%&,&g%&.&z%&0&d%&2&b%&4&p%&6.%&	%&5%&	%&1%&	%&-%&	%&)%&	%&%%&	%&!%&	%&%&	%&%&	%&%&		%&%&
+	%&
+%&	%&	%&	%&%&
+	%&%%%&%%&&&&%&�%%%%&	&%%%%&a%&
+&i%&&u%&&e%&&o%&�%&	%&%&	%&
+%&	%&	%&	%&%&	%&%%%&&&'%%'%%&&'&((('	(%%%'%	&%%&%'&&'	%&%%%%&&&%&��������%�%%	%%%%%>�%%%%%%%$%%%%&&&&%%"%%%%&	&%%�	%�%	%��������%&&&&&&%&&'	'&&%%&	%%�%%&%&%%%%s%?%�%%%~%% %%B%%�%%U%%�%%�%%�%%?%%�%%i%%x%	%�%%�%%�%%%%%%�	%%�	%2%"%3%%%u%%z%&%`%'%�%(%�%)%�%*%-%+%2%,%7%-%<%.%�%%�%%%%�%%�%%�% %+%!%y%"%�%#%%%%v%1%�%%F%%�%
+%h%:%I%;%T%0%J%/%p%8%�%9%�%%�%4%%5%
+%6%[%7%c%%�%
+%%<%�%$%P%=%!%>%!�%	%�	%
+%%%&%%&'G%%'''&%%a��%%�	%�%	%�%	%�%�%%%%%%%%&�&&%&Z%%%�	%���������%%%%%%)%%:�%%&&%%v%%�&%&	%�%	%��������%%%%%%%�%%�&%&	%�%	%��������%%%%%%%G%%�&%&	%�%	%��������%%%%%%%�&%&	%�%	%��������%&�&&'('&&(%%&&�(&)"))(	)%%#%%()
+))	%)%�%%)!))%))*$**(	*)'('	&'& %&%%%	%r	
+%	%%%F%%[	
+%	%%%<%%%%7%%%%&%'''&	'&&	%&%
+&%&	%N	E%0	%>%%	%%%&	%&%%%	%&%%%	%	
+%	%%%%%%%%&%&&%&&&	&%%%%
+	%%&(	&%&'%&()	('''&(*	('&'&'+	'&&%%&	%(%%%&	%&%%%	%&%%%	%)%%%&	%&%%%&&&	&%&(&&'''	'&&%&%%%',	'%&	%*%%%&	%&%%%	%&%%	&+%%%&	%&%)%%&&&	&%%*%%&&&	&%%,%%&%%&&&	%%&&&%'+''	&'&%%&	%�
+%	%%%�
+%%%%%&%&�
+&%&�
+&&	&%%%%
+	%%%%&	%&%%%&&&	&%&%&%%%&	%p
+%	%%%m
+
+%%%%f
+%%c
+%%	%
+%&%%&	%%%%%%	%%%%%%%%	%%&%%&	%k
+%	%%&&%=
+%%%%8
+%%5
+%%&%'''&	'&	%
+%&%%&	%L
+%	%%&&&&%
+%%%%%'%'
+'%'
+''	'%'&'&&&'&'
+'&'
+''
+	'&'
+((	'%%%%&%%%%;	%;	%%&(	&%&'%&()	('&'&'*	'&&%%&	%(%%%&	%&%%%&&&	%&%%%&
+&&	%&%%%;%%	%)%%%&	%&%%%	%&%%	&*%%%&	%&%(%%&&&	&%%)%%&&&	&%%;%%&%%&&&	%%&&&%'*''	&'&%%&	%�
+%	%%%�%%%%�%&%&&>'''''	&'&?'''''	&''@(((((	'((A)))))	()(B)))))	()(C)))))	()(D))	(
+(%(%	%E%%�%%�%%%%%%r%%|%%(%%2%	%.%
+%G%%�%%�%
+%'%%@%%\%%u%%;%%T%%�%%�%%%%t%%{%%�%%�%%�% %�%!%�%%F%%�%%�%%%%6%(%�%)%.%*%E%+%R%,%a%-%%.%�%/%�%0%��������<%&'%&	'%'>''	'%'?''	'%'@''	'%'A''	'%'B''	'%'C''	'%'D''	'%%&%%'%((('	('&	%C%&	&%&�>%	%?&	&@	&A	%B	%C	&D	&��������F%	%E%	%#�������F%	%E	%�������>%%�F%&C&&''&&D&&&%%C&%'��������&&'	%&%D&'&&&'&	%&%%A%%%	%B%%%	%
+%C&%'&&'	%&%D	%F%%
+@%&&%%?&%&	%@%&%%%&%	%b�������E%	%��������>%%pA%%%	%B%%%	%P�������E%	%��������>%%H�������^E%	%��������>%%UA%%%G	%%G	%G%B%%%%H	%C&&&&&&9?%%	%@%	%!?&	&D&&%%@	%@%%	%?&%	&D&&%%@	%@%%	%>%	%A%	%��������>%	%?%	%��������>%	%?%	%��������>%	%?%	%��������E%	%M�������>%%�
+I%&	%E%	%A�������>%%�
+I%�%%J&	%&&&'	%'%&%%P	%%P	%P%K&	%&&&'	%'%&%%L	%%L	%?%�%%M&	%&&&'	%'%&%%Q	%%Q	%Q%N&	%&&&'	%'%&%%O	%%O	%J%M%%&R'%	&R	'M%%K%N%%&S'%	&S	'L%O%%&T'%	&T	'L%N%%&S'%	&S	'K%O%%&T'%	&T	'R%%%S%%&%&%%%T%%%%�%%>&	%&%?	%%�������E%	%��������>%%3
+I%&	%E%	%��������>%%'
+I%�%%J(	%((()	%)%(%%P	%%P	%P%K(	%((()	%)%(%%L	%%L	%J%%U%'	%V%&	%U%&	%V%'	%K%%U%%%	%L%%V%%%	%?%U%%	%@%V%%	%>%	%��������E%	%)�������>%%���������	E%	% �������>%%�	@%	%��������E%	%�������>%%�	@%&?	&%%	%��������E%	%�������>%%�	?+X	+@,Y	,A%Z	%E%	%��������>%%�	Z%A%%%([%	(\%+	%]%,	%([%%%	(\%&	%]%'	%[%%\%%%%	%]%%%%	%[%(��������%%(	%%��������Z%A%%%\(]((&&''&&(''?	'@	&A	%1�������%\%%&]&&'+(,%'%&(&'?	'%%@	%&%A	%"�������%&&&%'
+	&'&&&%'	&'&%%&	%Q
+%	%%%%	%%%%%&%& 	&
+''	&&(((&)	()(((&	(%%%%&(	%(%&'	%2>%	%?%	%@	%A&	&B	%C	%��������F%	%E%	%P�������F%	%E%	%I�������>%%�F%&B&&''&&C&&&%%B&%'��������&&'	%&%C&'&&&'&	%&%%A%%%	%
+%B&%'&&'	%&%C	%F%%
+@%&&%%?&%&	%@%&%%%&%	%G%%��������G%	%F%	%E%	%��������G%	%F	%E%	%��������->-%%���������<%-	%=%?%%	%>%@%%	%?%A%%	%@%B%%	%A%C%%	%G%	%E%	%��������>%&%&j%F	%G%?%%	%H%@%%	%I%A%%	%J%B%%	%K%C%%	%>%<%%	%?%=%%	%@%>%%	%A%?%%	%B%@%%	%C%A%%	%C%	% �������>%F%%	%?%G%%	%@%H%%	%A%I%%	%B%J%%	%C%K%%	%�������E%	%u�������>%&%&%F	%G%?%%	%H%@%%	%I%A%%	%J%B%%	%K%C%%	%C%	%��������E%	%Q�������>%%�
+%	%%%�%%%%%&%&�&%&�%%%%
+	%$%	%$%	%
+%	%%&&%�
+%%%%�%%�%%	%
+%%%%%%�%%�%%
+	%
+%&%%&	%%%%,	%
+%%%-	%%%%$%%	%%%%&&	%%
+%%&&	%$%%,%-%%%	,%-%%%%	%,%	%-%	%%%%%%	%b4%	%5&	&6	%7%	%4%	%5%	%6%	%7	%4%	%5&	&6	%7	%4%
+%%&	&&%&:%	%
+	%4%%$
+%%%%(%%%%%	%4%%
+%%%%%%%%%%
+	%
+%&4&&%%&	%%%%5%%	%%%%&&	%%
+%%&&	%%%%7%%	%6%%�%&%%&	%
+%	%%&&%�
+%%%%�%%�%%1	%
+%%%%%%�%%�%%0	%
+%&%%&	%2%	%�	%$
+%	%%%�
+%%%%�%%�%%1	%
+%&%%&	%0%%%	%2%	%�%	%%3	%3%%%	%3%%%	%3&&	%3%%%%%	%3%%%%%&	%&%^&%'''&	'&	%3%%%%%	%3%%%%%	%3%%%%%2%%	%3%%%%%	%3%%%%%	%3%%%&&&%&%	%3%%%&&&%&%	%3%%%%%	%3%%%%%		%0%%0%3%%	%3%%%%%0%%	%3%%%%%1%%	%3%%%&&&	%&%	%3%%%%%	%3%%%%%	%3%%%%%2%%%%&%&%	%3%%%%%	%3%%%%%	%3%%%&&&%&%	%3%%%&&&%&%	%3%%%%%	%3%%%%%	%3%%%&&&%&%	%3%%%%%	%%&%%&	%3%%%�	%�%%�%&&&%'�''(''(	&'&%%&	%�.%%%%%	%.%&%%&	%�
+%	%%%b
+%%%%[%%%%	%
+%&%%&	%.%&&&%%&	%.%%%	%%%%	%%%%	%%%%	%%%%%%	%%%%%%&&	%%%%&%&%	%%%%	%%%%	%%%%%%	%%&%%&	%*%&'&((('	(%(''(	&'%%(	%%&&%&'(')))(	)&&((&	'(%%&	%%&%'''&(	'&&	%&%
+&%&	%%%%%3�������o
+%	%%%
+%	%%%%%%%&'&((('	(%%''%	&'&
+%	&X%	%%%%%%&&&&&&%&&'''%	'&&%%&	%%%%%��������	%&%	&	%%
+	%�%%&%%%%%$%%%%&&&&%%#%%�	%�%&%&&
+'&((('(()*)...*	.((**(	)*''(	&'&(%%&	%��������%%��������%	%
+%	%%%����������������%	%=	%%	%%%�%%%%%�&	%&%&%%�	%=%&&&%'�''	&'&%%&	%c%%%%%%%%%&\'	&'&%&&%&&%&&%&�&%&/&%&>&"%&&#%&c%[&	%&%[&	%&%\&&&&&	%&%[&	%&%]&	%&%%]%%&[&&%&-%]%%&%&%%%&%&%%%%%&'&(((')	()((('	(%%%%'(\((	%(%=(%)))(	)')'')	&'&()	%&%]&%&&)	%&%%]%%&[&&%&��������%&%%&	%%	%%%y�������_	=__	_	`	`^`_		`^��������	=.�									=��������		@	@				;
+									��������				b
+				
+
+d	
+d		d	d	d						��������		�g	gpg�		gp��������
+t	u	v	
+
+�h	i	ih	h
+n	o	p	i
+q	r	s	�	�	�n	�o	�p	�	�	�	���	�	�q	�r	�s	�	�	�	]�	�		
+	
+				"	h�	i�			 t	!u	"v	(		*	+	d	U		
+		d	H�	�	�	�	�	t	u	v			
+		d	 			
+		h>	i2	
+
+x	y	x	y	z		
+x	l			l		yl	l			l		zl	l			l�	l					d	b�	�	��	���������	��	�	�	�	�	�	�	�	�	�t	�u	�v	�		�	�	d	�	d	�	�	d	�
+	d	de	f	fef�		fe��������e		�������		
+�%%8%%G%%�%%!%%�%%�%%�%%9��������-%&%'''&(	'('''&(	'('^(')))(	)&)(()	'('''&(	'(''&'	%'%'%(((')	()((('	(&((('	((((')	()(''(	%'%'%(((')	()((('	(&&&&'(	&(&&'&	%&%0&	%&%1&&	%1%%
+0%%%%	%1%&��������%%&	%%��������%&&&%(	&(&&&%(0((	&(&&&%(	&(&&%&	&*	'+	%,%%%%%%i%%�%%%%'q��������%�%%&�&&'(')))(*	)*)))(	))))(	)%%%%()	%)%%(%	'%%'%)))'*	)*)))'*	)*)))'*	)*))')	%)%)%***).	*.***)	*)*	*)	%%***%.	*.***%	*''''%	')'''%)	')''%'	'')))'*	)*)))'	)%%%%'	%&%%%'&	%&%%'%	%%&&&%)	&)&&&%	&(&&&%	&'&&&%'	&'&&%&	&�	%�%%�%%%%M%%W%%E%%O%%�%%�%	%�%
+%�%%����������/%&&&%'	&'&&&%'	&'&&&%	&'&&%&	&2	%0	/1	%2%	%�	%8��������%3	%0%2%%	%1	/2%	%�%	%'��������%4	%%&&&%'	&'&&&%'	&'&&&%'	&'&&%&	&&'''&(	'('''&(3((	'('''&(	'(''&'	''(((')	()(((')4))	()(((')	()(('(	(()))(*	)*)))(	)%%%%(	%&%%%(&	%&%%(%	%%&&&%)	&)&&&%	&(&&&%	&'&&&%'	&'&&%&	&�	%�%%v%%�%%�%%"H�������01%&&&%'	&'&&&%'	&'&&&%'	&'&&%&	&0	11	%%2	%%�	%���������2%&&&%'	&'&&&%	&0&&&%'	&'&&%&	&3&&&3'	&'&&&3	&1&&&3'	&'&&3&	&�	2�	%�	0%�	%���������4�	2�	3�	1%�	%���������%�	%4%�	%%%���������560	61	5%2	%%�	%I��������7%&&&%'	&'&&&%'	&'&&&%'	&'&&%&	&8&&&8'	&'&&&8'	&'&&&8'	&'&&8&	&�	7�	%�	5%�	%8��������9�	7�	8�	6%�	%,��������%	%9%	%%%�%% ��������
+%%%&&&'
+''()(***).	*.***)	*)	')'	')	('((('*	(*((('	(&&&&'	&%%%%'&	%&%%'%	%0	)1	'%2	%%�	%���������%	%	%%�%%�K�������%%%&&&'''()(***).	*.***)	*&&&&)	&%%%%)&	%&%%)%	(%%&%(((&*	(*(((&	(''''&	'&'	'&	%	)	&%	%���������%�%%&	&	%%%%%�%%��������:%%%&&&'	':'	'	%	&%	%��������%%%&	&	%%	%�������;<�	:%�	%���������=%&&&%'	&'&&&%'	&'&&&%'	&'&&%&	&>&&&>'	&'&&&>'	&'&&&>'	&'&&>&	&�	=�	%�	;%�	%<��������?�	=�	>�	<%�	%0��������%	%?%	%%%9%%�%%��������@ %!A%%"%%&	&@&	&	A	%%	%3�������%%%&	&	%%	%��������BC�	@%�	%���������D�	A%�	%}��������%&%'''&(	'('''&(	'('''&(	'(''&'	%'%'%(((')	()(((')	()(((')	()(('(	%(%�	%�	&�	'%�	%���������%E%&&&E'	&'&&&E'	&'&&&E'	&'&&E&	%&%�	%D%�	%�	B%�	%���������F�	D�	E�	C	%�	%���������%	%F%	%%%%%&��������&G'H(I)J	G 	H!	I"	J%	%W�������KL	I 	J!	G"	H%	%G�������%%%&'&(((')	()((('	(K((('	('(	('	&&(((&)	()(((&	(L(((&	(%%%%&(	%(%%&%	%#	'$	&%%%S%%�%%9��������
+%	%%%��������%%%%%&%&��������&:	&%%
+&&	%;%%%%%%p%%�%% 
+%%$
+��������%;	%��������:M%;	%��������:N-	M%,	%��������*O+P-	N%,	%w�������*%+%%&&	&O&'	&P&(	&)	%%%	%Y�������#%$%%&'(')))(*	)*)))(	)&&&&()	&)&&(&	'&&')a))**)*.a	.****)	*(((()	(&((()	(&&&&)	&'&'(>	(''?	'@	%A	)B	&�������%;	%y�������:%-	%%,	%$�������*%+%%&'(')))(*	)*)))(	)&&&&()	&)&&(&	'&&')'***).	*.***)	*&&&&)*	&*&&)&	'&&&	&'	%(	()	)%%	%��������#%$%%&'(')))(*	)*)))(	)&&&&()	&)&&(&	'&&')a))**)*.a	.****)	*(((()	(&((()	(&&&&)	&'&'(>	(''?	'@	%A	)B	&��������%;	%�������:%-	%%,	%��������*%+%%&'(')))(*	)*)))(	)&&&&()	&)&&(&	'&&')'***).	*.***)	*&&&&)*	&*&&)&	'&&&	&'	%(	()	)%%	%o�������#%$%%&'(')))(*	)*)))(	)&&&&()	&)&&(&	'&&')a))**)*.a	.****)	*(((()	(&((()	(&&&&)	&'&'(>	(''?	'@	%A	)B	&�������	%E	%��������>%%(�������?%>	%@%?	%A%@	%B%A	%
+%E	%n�������>%%
+�������?%B	%@%C	%A%D	%B%E	%>%?%%&B&&'C''(Q()))Q*	)*)))Q	)Q	&Q&	&Q	(R&&&R(	&(&&&R	&%%%%R	%'%%%R&	%&%%R%	%@%A%%&D&&'E''()�	)�	%�	&�	'�	(%�	%��%�%%&'>	'&&?	&Q&@	&R&A	&B	%��������%E	%��������>%%��������?%@%%&'(')))(*	)*)))(	)&&&&()	&)&&(&	'&&')a))**)*.a	.****)	*(((()	(&((()	(&&&&)	&'&'(>	(''?	'@	%A	)B	&M�������%E	%��������>%%Y�������?%��������&0	&%%1	%%2	%%�	%���������%%%&%'''&	'&	%c�������%E	%��������>%%2�������?%��������&0	&%%1	%%2	%%�	%���������%%%&%'''&	'&	%<�������%E	%l�������>%%�������?%>	%@%?	%A%@	%B%A	%%E	%Q�������>%%��������>%?%%&?&&'@''()(***).	*.***)	*)	')'	')	('((('*	(*((('	(&&&&'	&%%%%'&	%&%%'%	%0	'1	)%2	%%�	%)��������%%%&%'''&	'&	%��������%E	%��������>%%��������?%>	%@%?	%A%@	%B%A	%%E	%��������>%%��������?%B	%@%C	%A%D	%B%E	%>%?%%&B&&'C''(	(	%	&	'%	%[�������ST@%A%%&D&&'E''()�	)�	%�	&�	'�	(%�	%J�%�%%&'>	'&&?	&S&@	&T&A	&B	%�������
+%E	%��������>%%'�������?%>	%@%?	%A%@	%B%A	%%E	%m�������>%%�������?%B	%@%C	%A%D	%B%E	%>%?%%&B&&'C''(	(&&	&'&	&	%%	%��������UV@%A%%&D&&'E''()�	)�	%�	&�	'�	(%�	%��%�%%&'>	'&&?	&U&@	&V&A	&B	%�������� %!%%&$&&'%''(
+	(	%	&
+	'%		%�������%.	%$%%%%& &&'!''(
+	(	%	&
+	'%		%��������%/	%(%%/%0	%.%1	%.%0	%/%1	%0%$%%& &&'�	'�	%�	&
+%�	%���������%2	%0%%%%&!&&'�	'�	%�	&%�	%���������%3	%.%/%%&'&(((')	()((('	('	%'%	%'	&�	'%�	%F��������%4	%"%#%%&1&&'�	'�	%�	&%�	%
+�%5	%&%'%%&0&&'�	'�	%�	&%�	%��%6	%"%#%%&&&&''''()�	)�	%�	&�	'�	(%�	%�
+�%7	%�%8	%4%7%%&8&&'�	'%%�	%&%�	%%�	%��%9	%:%a%%	%<%	%<%#%%%*5%<%%%%%%%%&&&&&'''''(((a(())()*a	*))))(	)%%%%(	%&%%%(	%'%%%(	%<%&%%&	%��������<%	%<%'%%%*6%<%%%%%%%%&&&&&'''''(((a(())()*a	*))))(	)%%%%(	%&%%%(	%'%%%(	%<%&%%&	%��������<%	%<%8%%%*9%<%%%%%%%%&&&&&'''''(((a(())()*a	*))))(	)%%%%(	%&%%%(	%'%%%(	%<%&%%&	%��������#%'%%&8&&%&%;	%:%;%%&�	&�	%%�	%d2%)	%3%*	%�%+	%�%,	%-%%B%%���������%E	%O�������>%%��������?% 	%@%!	%A%"	%B%#	%%E	%4�������>%%��������?%$	%@%%	%A%&	%B%'	%(%	%-%	%�������)%*%%&+&&',''()>	)((?	(@	%A	&B	'�������� %E	%��������>%%��������?%H	%@%I	%A%J	%!%E	%��������>%%��������?%K	%@%L	%A%M	%%&%'''&(	'('''&	'&'	'&	%%'%(((')	()((('	('(	('	%%(%)))(*	)*)))(	)()	)(	%H%I%%)J))*a**..*.0a	0....*	.((((*	(*	%*	)>	*%(%)))(*	)*)))(	)()	)(	%%)%***).	*.***)	*)*	*)	%%*%...*0	.0...*	.*.	.*	%K%L%%.M..0a001101:a	:11110	1****0	*0	%0	.?	0%W%***W.	*.***W	*W*	*W	%%X%***X.	*.***X	*X*	*X	%%*%...*0	.0...*	.*.	.*	%%.a..00.01a	10000.	0****.	****.	*.	%@	.	&	'	(	)%	%��������YZ>%?%%&'()�	)�	&�	%�	'�	(%�	%u�%�%%&@&&'( 	(W(!	(X("	(&&#	&'&$	&Y&%	&Z&&	&'	%(%	%-%	%��������)%*%%&+&&',''()>	)((?	(@	%A	&B	'#�������%%%%%&&&&&'''''(((R	(''S	'='''	'%%%%=	%=%%%	%&%%%=	%%&%'''&(	'('''&	'&'	'&	%T	&U%	%U%S%%%KR%U%%%%%%%%&'&(((')	()((('	(%%%%'(	%(%%'%	&%%%%&%(((&)	()(((&	(&	'&'	'&	%T%'(')))(*	)*)))(	)%%%%(	%&%%%(&	%&%%(%	'%	(U%&%%&	%��������T%=%%&&&%	&%%=	%%&%'''&(	'('''&	'&'	'&	%T	&U%	%U%S%%%KR%U%%%%%%%%&'&(((')	()((('	(%%%%'(	%(%%'%	&%%%%&%(((&)	()(((&	(&	'&'	'&	%T%'(')))(*	)*)))(	)%%%%(	%&%%%(&	%&%%(%	'%	(U%&%%&	%��������T%=%%&&&%	&%%=	%%&%'''&(	'('''&	'&'	'&	%T	&U%	%U%S%%%KR%U%%%%%%%%&'&(((')	()((('	(%%%%'(	%(%%'%	&%%%%&%(((&)	()(((&	(&	'&'	'&	%T%'(')))(*	)*)))(	)%%%%(	%&%%%(&	%&%%(%	'%	(U%&%%&	%��������T%=%%&&&%	&%%=	%��������
+%&	&&%&��������&&&%&&'&'��������&%%&	%%&'&(((')	()((('	(%%%%'	%'	&%&&&%	&'&%%&	%��������
+%&	&&%&��������&&&%&&'&'��������'%%'	%&%%��������'��������''()*)...*[	.[...*	.((((*	('((*(	)((^)(...)	.*.)).	()()(...)[	.[...)	.*...)	.&&&&)	&'&&)&	(&&(&)))(.	).)))(	)*)))(	)'))()	&)&)&***).	*.***)	*%***)	***)*	&*&*&...*[	.[...*	.((((*	()(((*	(((*(	&(&(&)))(.	).)))(	)%%%%(	%'%%(%	&%%&%)))&.	).)))&	)((((&	('''&'	%'%'%(((')	()((('	(*((('	(&&&&'	&'	%%&&&%	&'&%%&	%�������%%&'(')))(*	)*)))(	)%%%%()	%)%%(%	'%%=%%'''%	'('%%''=	'%%%%%%'(')))(*	)*)))(	)%%%%()	%)%%(%	'%%=%%'''%	'('%%''=	'%%%%%%'(')))(*	)*)))(	)%%%%()	%)%%(%	'%%=%%'''%	'('%%''=	'%%%%'%(((')	()((('	('(	('	%=%%%	%'%%%=	%%'''%(	'('''%	'&&&&%'	&'&&%&	&=&&&	&%%%%=	%��������%;	%��������:\%;	%��������:]-	\%,	%j�������*^+_-	]%,	%`�������*`+%	%`%	%	^	_%	%��������%%%&'&(((')	()(((')	()(((')	()(('(	&(&&&(&&(()(***).		*.***)	*'***)	*`*	**)	*&***).	*.*))*	()()(***).		*.***)	*`***)	*''	'')	'&&&&)'	&'&&)&	(&&'&(((')
+	()(((')	()(''(	&'&>'	&'&?	&@	%��������%%%%%&&&=&&'''&	'%%%&%&=	&%%=%%&&&%	&%%=	%��������%%%&&&&%�������&'&''((&&	&%%%%&'%'<&&'%&%?%%?%0%@%�%A%�%B%�%C%�%D%�%E%�%F%�%G%���������%	%�% %�%�&%&'	'&	%�% %���������%�%%	%�%%:�%	%�%	%�%%%�%%&%%&%�%&%&%	%�%&%%&	%�%%%�%%&%%&%���������%�%%%%	%�%&�&&&&%%&	%�%%���������%%@%%�%%�%%�%%�%%�%%�%%�/��������%	%�%�%%	%�%�%%	%�%	%�%	%�%%�%&%&%	%�%&%%&	%�%%���������%%Q�%	%%�&%'�''&'(	('&	%�%	%%�&%'�''&'(	('&	%�%�%%&%'�''(�(()�))&'&(%)%&%%%�%&�&&%%&	%�%&%&'�	'%	&�%%%�%%%���������%&%&%	%�%%%�%%%�����������������%%�%%�%%�%%�%%�%%�%%�%%�%	%%
+%���������%	%�%	%�	%d��������%&%	&�	%�	%[��������%&%	&�	%�%	%Q�������E%(	%��������>%%v�������?%%%%%�	%�%?%%&%&%%%&&&%%&	%�%%%@%%%%�	%%%V��������%	%�%	%�%�%%%�%&%&%	%�%&%%&	%�%�%%%��������>%"	%?%�%%	%@%	%A	%B	%C	%D	%��������%	%�%	%�%	%
+�%	%	�%	%�%	%E%-	%d�������>%"%��������%?%%	%�	%E%)	%U�������>%"%���������%?%%	%�	%�%%%%%%%%%%+%%2���������%	%B�������
+�%	%E��������%	%H��������%�%%	%���������%�&%'�''	&	%'�%	%6��������%%}��%	%��������%%xs�%	%��������%%n�%�%%&%&%	%�%�%%	%�%		%���������%%W�%�%%	%�%�%%&%&%	%�%
+	%���������%%IDE%.	%��������>%"%x��������%?%%	%�%	%���������%	%�	%�	%�% %!�%�%%%%�%%&&%&�%&%%&	%�%�&�'&%%'%%	%'	&�% %���������%%�%	%�%	%%%%&	%&%%%&�&&	%&%%%	%0�������E%/	%}�������>%"%��������%?%%	%�	%�&%&%	%�%	%���������%�%%	%�%�%%&&&%	&�	%�%	%w��������%�%%	%>%#	%?%�%%	%@%�%%	%A%	%B	%C	%D	%��������E%*	%<�������>%#%���������%	%�	%��������E%+	%-�������>%#%���������%?%%	%�%@%%	%E%,	%�������>%#%���������%?%%	%�%@%%	%�%	%�% %�%�&%&'	'&	%�% %���������%�%%	%�%%%	%�%	%���������%�%%	%�%	%�%	%���������%�%%	%�%%%	%�%	%���������%�%%	%�%	%�%	%���������%	%�% %�%�&%&'�''''�''&('(	'&	%�% %���������%%��������%%��������%%��������%%D��������%	%�	%�&	&�	%�% %;��������%�%%%%&%'(''*�������()�������%&	�%&�&&%%&	%�%&�&&%%&	%�%&%&%	%�%&%%&	%�% %���������������%�&&	%�%	%c��������%	%�	%�% %�%�&%&'�('(	'&	%�% %���������%�%%	%�%	%��%	%�% %���������%�%%%&&�	%�%	%��%&%%&	%�% %����������������%�&&&&&	%&%�	%&%�&&	%�%	%
+��������%	%�% %�%�&%&'�''&	'&	%�% %���������%�%%	%�%	%���������%	%�% %�%�&%&'�''&('(	'&	%�% %���������%	%�	%�% %�%�%%%%%�%&%%&	%�%&%%&	%�% %���������%�%%	%�%	%1�%	%�% %e��������%�%%%%%%�	%�%	%�%&%%&	%�% %��������M��������%	%�%	%	�%�%%	%�%	%%&&&%'	&'&&&%(�((	&(&&&%(	&(&=(&)))(	)%%%'	%('	&�%%�������%%/�������%%��������%%��������%%��������%%�����������������%�%%&&&&�	&�	%&'�	'&&&%%%%�	%&'�	'&&&%%�	%�%�%%&&&&�	&�	%&'�	'&&&%%%%�	%&'�	'&&&%%�	%�%�%%%%�	%�%%�%%�%�%%	%�%�%%	%��%�%%	%�%�%%	%��%	%�%	%%%%%%%	%%%%	%��������%�%%&&&%%&%�	%�	%�%�%%%�%	%�%�%%%�	%%�	%�%�%%&�&&'&'&&&%&%�	%%	%�%	%%%%%%%	%%%%	%��������%%%&�&&'&'%	%&%	&%	%%		%	%%%%%%		%%%%	%��������	%&�&&%&%�	%�%�%%%�%!%	%,%�%%	%'%
+	%�%	%%%%%%%	%
+%%%
+	%��������%�%%&''%&%	%	%%	%�%	%%%%%%%	%%%%	%��������%%%&�	&%&&&'&'%�	%&%%�	%�%�%%	%�%%z���������%�%%&&&&�	&�	%&'�	'&&&%%%%�	%&'�	'&&&%%�	%%	%�%	%%%%%%%	%%%%	%��������%�%%&&%&%	%	%�%�%%	%%	%�%	%%%%%%%	%%%%	%��������%%%&�	&%&&&'&'%�	%&%%�	%�%�%%	%�%%�%%���������%a%%	%�%	%�%�%%%?�%�%%%%%%%%&�&&'(')))(*	)*)))(	)&&&&(	&%%%%(&	%&%%(%	'%%%%%%&&&&&'''a''))')*a	*))))'	)(((('	(%%%%'	%&%%%'	%�%&%%&	%���������%%��������%%��������%%����������������%	%%&�&&%&&�&&&&%'(&(&	&'&%%&	%���������%a%%	%�%	%	%%�%%%�%�%%%%&&&%&&'&'|&
+'''%''	&'&''	&&�&&&I&�&&&&&&&&'&':&&&&%&&'''''&'1&&&&%&&'''''&'(&&&&%&&'''''&'&
+'&((((()*)...*[	.[...*	.''''*	'('''*(	'(''*'	)'	&*&''	&&'&&'	&��������%&&&%&&'%'%%%'
+''(a(())()*a	*))))(	)''''(	'(	&(	%�%&%%&	%%&%%&	%q��������%%,%%�����������������%�%%&�&&%%&	%�%a%%	%�%	%�%�%%%a%&%%&	%�%%%&	%���������%	%�	%�%�%%%��%	%�%�%%%��%�%%%%�%%&�&&%%&&&&&&'''%''()(***).	*.***)	*&&&&)	&'&&&)'	&'&&)&	(&&�	&)&&&&&'�	'&&&&&&'�	'&&&&�	&%&�	&%&�	&%%�	%�%%	%%)%%I�%	%���������%�	%�%�	%�%�	%�%	%���������%�	%�%�	%�%�	%�%	%o��������%�	%�%�	%�%�	%�%	%���������%�	%�%�	%�%�	%�%	%M��������%�%%%�%�%%%�%�%%%�%�	%�%�	%�%�	%
+�%	%�	%�%	%�%�%%&%%&%%%%�%%%%�%%'''	'%%�%%'''	'%%�%%'''	'%%�%%''	%�%%%&	%�%%%&	%��������%&%%&	%��������%�%%	%�%�%%	%�%	%%��������%�%%	%�%�%%	%�%%�������%%��������%%��������%%��������%%Q���������������
\ No newline at end of file
Index: trunk/runtime/gvcpu.py
===================================================================
trunk/runtime/gvcpu.py
new file mode 100644
--- a/trunk/runtime/gvcpu.py	(nonexistent)
+++ b/trunk/runtime/gvcpu.py	(revision 2)
@@ -0,0 +1,944 @@
+# -*- coding: utf-8 -*-
+"""lane64 の GPU 実行台(limb 版)。thread 一本が lane 一本になる。
+
+仕様は docs/common-compiler/arch/20。式 (2.1) の解釈器と同じ意味を、CUDA の kernel の中で
+lane ごとに走らせる。cuvcpu.py は語を bit 平面に持ち、命令一つが平面の演算の列になるので、
+語が広いと launch の数で足が止まる。ここでは語を 64 bit の limb の並びで持ち、lane ごとの
+thread が block を跨いで命令を辿る。分岐は thread ごとに好きに飛ぶ(mask は要らない)。
+
+  並び   語 主。語 w の limb i、lane l は M[(w·NLIMB + i)·lanes + l] に置く。
+         同じ語を読む lane の番地が連続するので、warp の memory access が一度で済む。
+         lane 主に置くと lane ごとに words·NLIMB 語ずつ離れ、一命令が 32 回の転送になる
+  語     NLIMB 本の limb。二の補数、little endian。既定 16 本 = 1024 bit
+  landmark  R[0..7]。commonc の lane64 版は R1 R2 R3 だけを使う(back_lane64.cam の覆い)
+  作業領域  lane ごとに words 語。読む語(watch)だけを host へ戻す
+
+語の幅を越えた乗算は報告 43 で止まる。lane64 の語は ℤ なので(20 §0.3)、この道は
+NLIMB·64 bit を越えた時点で core 意味論と離れる。
+
+  run(prog, seeds, words, watch, need=None) → lane ごとの (報告, {語: 値})
+"""
+
+import numpy as np
+
+INSN_FIELDS = 7
+NREG_BYTES = 8 * 8          # shared memory へ置く register。NREG 本 × 8 byte
+R_OK, R_KO, R_WIDE, R_BUDGET = 0, 42, 43, 44
+
+SRC = r"""
+#define NLIMB %(nlimb)d
+#define NREG 8
+typedef unsigned long long u64;
+typedef long long i64;
+
+struct Big { u64 v[NLIMB]; };
+
+__device__ __forceinline__ void big_zero(Big &r) { for (int i = 0; i < NLIMB; i++) r.v[i] = 0; }
+__device__ __forceinline__ void big_imm(Big &r, i64 x) {
+    r.v[0] = (u64)x; u64 f = (x < 0) ? ~0ULL : 0ULL;
+    for (int i = 1; i < NLIMB; i++) r.v[i] = f;
+}
+__device__ __forceinline__ bool big_neg_p(const Big &a) { return (a.v[NLIMB - 1] >> 63) != 0; }
+__device__ __forceinline__ void big_add(Big &r, const Big &a, const Big &b) {
+    u64 c = 0;
+    for (int i = 0; i < NLIMB; i++) {
+        u64 s = a.v[i] + b.v[i]; u64 c1 = (s < a.v[i]) ? 1 : 0;
+        u64 t = s + c; u64 c2 = (t < s) ? 1 : 0;
+        r.v[i] = t; c = c1 | c2;
+    }
+}
+__device__ __forceinline__ void big_not(Big &r, const Big &a) { for (int i = 0; i < NLIMB; i++) r.v[i] = ~a.v[i]; }
+__device__ __forceinline__ void big_negate(Big &r, const Big &a) {
+    Big n; big_not(n, a); Big one; big_imm(one, 1); big_add(r, n, one);
+}
+__device__ __forceinline__ void big_sub(Big &r, const Big &a, const Big &b) { Big nb; big_negate(nb, b); big_add(r, a, nb); }
+__device__ __forceinline__ bool big_eq(const Big &a, const Big &b) {
+    for (int i = 0; i < NLIMB; i++) if (a.v[i] != b.v[i]) return false; return true;
+}
+__device__ __forceinline__ bool big_lt(const Big &a, const Big &b) {
+    bool na = big_neg_p(a), nb = big_neg_p(b);
+    if (na != nb) return na;
+    for (int i = NLIMB - 1; i >= 0; i--) { if (a.v[i] != b.v[i]) return a.v[i] < b.v[i]; }
+    return false;
+}
+__device__ __forceinline__ void big_shl(Big &r, const Big &a, int s) {
+    if (s <= 0) { r = a; return; }
+    int w = s / 64, bts = s %% 64;
+    Big t; big_zero(t);
+    for (int i = NLIMB - 1; i >= w; i--) {
+        u64 hi = a.v[i - w] << bts;
+        u64 lo = (bts && i - w - 1 >= 0) ? (a.v[i - w - 1] >> (64 - bts)) : 0;
+        t.v[i] = hi | lo;
+    }
+    r = t;
+}
+// |a|·|b| を 2·NLIMB limb で作り、上半分が零でなければ幅を越えたとみなす
+__device__ bool big_mul(Big &r, const Big &a0, const Big &b0) {
+    Big a, b; bool na = big_neg_p(a0), nb = big_neg_p(b0);
+    if (na) big_negate(a, a0); else a = a0;
+    if (nb) big_negate(b, b0); else b = b0;
+    // 上位の零の limb は掛けない。小さい数どうしなら 1 回の乗算で済む
+    int la = 0, lb = 0;
+    for (int i = 0; i < NLIMB; i++) { if (a.v[i]) la = i + 1; if (b.v[i]) lb = i + 1; }
+    u64 acc[2 * NLIMB];
+    for (int i = 0; i < 2 * NLIMB; i++) acc[i] = 0;
+    for (int i = 0; i < la; i++) {
+        u64 carry = 0;
+        for (int j = 0; j < lb; j++) {
+            u64 lo = a.v[i] * b.v[j];
+            u64 hi = __umul64hi(a.v[i], b.v[j]);
+            u64 s = acc[i + j] + lo; u64 c1 = (s < lo) ? 1 : 0;
+            u64 t = s + carry; u64 c2 = (t < s) ? 1 : 0;
+            acc[i + j] = t;
+            carry = hi + c1 + c2;
+        }
+        int k = i + lb;
+        while (carry && k < 2 * NLIMB) { u64 s = acc[k] + carry; carry = (s < carry) ? 1 : 0; acc[k] = s; k++; }
+    }
+    bool wide = false;
+    for (int i = NLIMB; i < 2 * NLIMB; i++) if (acc[i]) wide = true;
+    if (acc[NLIMB - 1] >> 63) wide = true;
+    for (int i = 0; i < NLIMB; i++) r.v[i] = acc[i];
+    if (na != nb) { Big t = r; big_negate(r, t); }
+    return wide;
+}
+
+// 語の番地 → 詰めた並びの位置。work が 0 なら詰めない
+__device__ __forceinline__ i64 slot(i64 a, int need, int work, int words) {
+    if (work == 0) return (a >= 0 && a < words) ? a : -1;
+    if (a >= 0 && a < need) return a;
+    if (a >= work && a - work + need < words) return a - work + need;
+    return -1;
+}
+
+extern "C" __global__
+void lane64_run(const i64 *prog, int ninsn, u64 *M, int words, int lanes, i64 budget,
+                int need, int work, int *report, i64 *steps,
+                const u64 *ROM, i64 romlo, i64 romn)
+{
+    int lane = blockIdx.x * blockDim.x + threadIdx.x;
+    if (lane >= lanes) return;
+    Big R[NREG];
+    int pc = 0; i64 n = 0; int rep = %(r_budget)d;
+    while (n < budget) {
+        n++;
+        if (pc < 0 || pc >= ninsn) { rep = %(r_end)d; break; }
+        const i64 *ins = prog + (size_t)pc * %(fields)d;
+        int op = (int)ins[0], a = (int)ins[1], b = (int)ins[2], c = (int)ins[3];
+        int sb = (int)ins[4], sc = (int)ins[5]; i64 im = ins[6];
+        if (op == 0) { rep = %(r_end)d; break; }                         // HALT
+        else if (op == 1) { big_imm(R[a], im); pc++; }                  // MAT
+        else if (op == 2) { Big x, y; big_shl(x, R[b], sb); big_shl(y, R[c], sc); big_add(R[a], x, y); pc++; }   // ADD
+        else if (op == 3) { Big t; if (big_mul(t, R[b], R[c])) { rep = %(r_wide)d; break; } R[a] = t; pc++; }  // MUL
+        else if (op == 4) { Big t; big_negate(t, R[b]); R[a] = t; pc++; }   // NEG
+        else if (op == 5) { Big x, y; big_shl(x, R[b], sb); big_shl(y, R[c], sc); pc += big_eq(x, y) ? (int)im : 1; }   // EQ
+        else if (op == 6) { Big x, y; big_shl(x, R[b], sb); big_shl(y, R[c], sc); pc += big_lt(x, y) ? (int)im : 1; }   // LT
+        else if (op == 7) { pc += (int)im; }                            // JMP
+        else if (op == 8) {                                             // LD
+            i64 raw = (i64)R[b].v[0];
+            if (raw >= romlo) {                                         // 共有帯。lane で割らない
+                i64 o = raw - romlo; if (o >= romn) { rep = %(r_end)d; break; }
+                const u64 *w = ROM + (size_t)o * NLIMB;
+                for (int i = 0; i < NLIMB; i++) R[a].v[i] = w[i]; pc++;
+            } else {
+                i64 addr = slot(raw, need, work, words); if (addr < 0) { rep = %(r_end)d; break; }
+                const u64 *w = M + ((size_t)addr * NLIMB) * (size_t)lanes + lane;
+                for (int i = 0; i < NLIMB; i++) R[a].v[i] = w[(size_t)i * lanes]; pc++;
+            }
+        }
+        else if (op == 9) {                                             // ST
+            i64 raw = (i64)R[b].v[0];
+            if (raw >= romlo) { rep = %(r_end)d; break; }               // 共有帯へは書けない
+            i64 addr = slot(raw, need, work, words); if (addr < 0) { rep = %(r_end)d; break; }
+            u64 *w = M + ((size_t)addr * NLIMB) * (size_t)lanes + lane;
+            for (int i = 0; i < NLIMB; i++) w[(size_t)i * lanes] = R[c].v[i]; pc++;
+        }
+        else if (op == 10) { rep = %(r_ok)d; break; }                   // OK
+        else if (op == 11) { rep = %(r_ko)d; break; }                   // KO
+        else if (op == 12) { pc++; }                                    // PUT(GPU では捨てる)
+        else { rep = %(r_end)d; break; }
+    }
+    report[lane] = rep; steps[lane] = n;
+}
+
+
+// ===== 語が 64 bit で足りるときの道 =====
+//
+// Big R[NREG] は添字が命令から来るので、compiler が register に置けず local memory へ落ちる。
+// 一命令ごとに local への往復が入り、thread 一本の歩みが桁で遅くなる。
+// 語を 64 bit に決め打てる場合は、register を shared memory の
+//
+//     R[k]  =  sreg[k * blockDim.x + threadIdx.x]
+//
+// へ置く。stride が blockDim.x なので bank が衝突せず、添字が動いても速い。
+// 積が 64 bit を越えたら幅の報告で止める(意味は Big の道と同じ)。
+
+extern "C" __global__
+void lane64_run1(const i64 *prog, int ninsn, u64 *M, int words, int lanes, i64 budget,
+                 int need, int work, int *report, i64 *steps,
+                 const u64 *ROM, i64 romlo, i64 romn)
+{
+    extern __shared__ i64 sreg[];
+    int lane = blockIdx.x * blockDim.x + threadIdx.x;
+    if (lane >= lanes) return;
+    i64 *R = sreg + threadIdx.x;
+    const int rs = blockDim.x;
+    int pc = 0; i64 n = 0; int rep = %(r_budget)d;
+    while (n < budget) {
+        n++;
+        if (pc < 0 || pc >= ninsn) { rep = %(r_end)d; break; }
+        const i64 *ins = prog + (size_t)pc * %(fields)d;
+        int op = (int)ins[0], a = (int)ins[1], b = (int)ins[2], c = (int)ins[3];
+        int sb = (int)ins[4], sc = (int)ins[5]; i64 im = ins[6];
+        if (op == 0) { rep = %(r_end)d; break; }
+        else if (op == 1) { R[a * rs] = im; pc++; }
+        else if (op == 2) { R[a * rs] = (R[b * rs] << sb) + (R[c * rs] << sc); pc++; }
+        else if (op == 3) {
+            i64 x = R[b * rs], y = R[c * rs];
+            u64 ux = (u64)(x < 0 ? -x : x), uy = (u64)(y < 0 ? -y : y);
+            if (__umul64hi(ux, uy) || ((ux * uy) >> 63)) { rep = %(r_wide)d; break; }
+            R[a * rs] = x * y; pc++;
+        }
+        else if (op == 4) { R[a * rs] = -R[b * rs]; pc++; }
+        else if (op == 5) { pc += ((R[b * rs] << sb) == (R[c * rs] << sc)) ? (int)im : 1; }
+        else if (op == 6) { pc += ((R[b * rs] << sb) < (R[c * rs] << sc)) ? (int)im : 1; }
+        else if (op == 7) { pc += (int)im; }
+        else if (op == 8) {
+            i64 raw = R[b * rs];
+            if (raw >= romlo) {                                         // 共有帯。lane で割らない
+                i64 o = raw - romlo; if (o >= romn) { rep = %(r_end)d; break; }
+                R[a * rs] = (i64)ROM[(size_t)o]; pc++;
+            } else {
+                i64 addr = slot(raw, need, work, words); if (addr < 0) { rep = %(r_end)d; break; }
+                R[a * rs] = (i64)M[(size_t)addr * (size_t)lanes + lane]; pc++;
+            }
+        }
+        else if (op == 9) {
+            i64 raw = R[b * rs];
+            if (raw >= romlo) { rep = %(r_end)d; break; }               // 共有帯へは書けない
+            i64 addr = slot(raw, need, work, words); if (addr < 0) { rep = %(r_end)d; break; }
+            M[(size_t)addr * (size_t)lanes + lane] = (u64)R[c * rs]; pc++;
+        }
+        else if (op == 10) { rep = %(r_ok)d; break; }
+        else if (op == 11) { rep = %(r_ko)d; break; }
+        else if (op == 12) { pc++; }
+        else { rep = %(r_end)d; break; }
+    }
+    report[lane] = rep; steps[lane] = n;
+}
+
+// ===== 多数の lane が一つの仕事を分ける道 =====
+//
+// 段と段の間では、lane i が書いた値を lane j が読む。そのために
+//
+//   1. 共有帯へ書ける(既存の道は報告 45 で止める)
+//   2. 書いた後に grid 全体で足並みを揃える
+//
+// の二つが要る。合図は「共有帯への書き込み」そのものにする。境界へ書く所が
+// チェンバーの接合点なので、pc を外から指さなくて済む。全 lane が段ごとに
+// ちょうど一度ずつ書く形の平文でだけ使える。
+//
+// 足並み揃えは世代を反転させる素朴な形。block が全部同時に載っていないと
+// 止まるので、grid は device に載る数までに抑える(host 側で決める)。
+
+__device__ __forceinline__ void gbar(int *cnt, int *gen, int nblocks)
+{
+    __syncthreads();
+    if (threadIdx.x == 0) {
+        int g = *((volatile int *)gen);
+        __threadfence();
+        if (atomicAdd(cnt, 1) == nblocks - 1) {
+            *cnt = 0;
+            __threadfence();
+            atomicExch(gen, g + 1);
+        } else {
+            while (*((volatile int *)gen) == g) __threadfence();
+        }
+    }
+    __syncthreads();
+}
+
+extern "C" __global__
+void lane64_runb(const i64 *prog, int ninsn, u64 *M, int words, int lanes, i64 budget,
+                 int need, int work, int *report, i64 *steps,
+                 u64 *ROM, i64 romlo, i64 romn, int *cnt, int *gen, int nblocks)
+{
+    extern __shared__ i64 sregb[];
+    int lane = blockIdx.x * blockDim.x + threadIdx.x;
+    i64 *R = sregb + threadIdx.x;
+    const int rs = blockDim.x;
+    // 足並みを揃える以上、休んでいる thread を作れない。lanes は grid x block に
+    // ちょうど合わせる(余りの lane は自分の席で同じ文を走らせる)。
+    int pc = 0; i64 n = 0; int rep = %(r_budget)d;
+    while (n < budget) {
+        n++;
+        if (pc < 0 || pc >= ninsn) { rep = %(r_end)d; break; }
+        const i64 *ins = prog + (size_t)pc * %(fields)d;
+        int op = (int)ins[0], a = (int)ins[1], b = (int)ins[2], c = (int)ins[3];
+        int sb = (int)ins[4], sc = (int)ins[5]; i64 im = ins[6];
+        if (op == 0) { rep = %(r_end)d; break; }
+        else if (op == 1) { R[a * rs] = im; pc++; }
+        else if (op == 2) { R[a * rs] = (R[b * rs] << sb) + (R[c * rs] << sc); pc++; }
+        else if (op == 3) {
+            i64 x = R[b * rs], y = R[c * rs];
+            u64 ux = (u64)(x < 0 ? -x : x), uy = (u64)(y < 0 ? -y : y);
+            if (__umul64hi(ux, uy) || ((ux * uy) >> 63)) { rep = %(r_wide)d; break; }
+            R[a * rs] = x * y; pc++;
+        }
+        else if (op == 4) { R[a * rs] = -R[b * rs]; pc++; }
+        else if (op == 5) { pc += ((R[b * rs] << sb) == (R[c * rs] << sc)) ? (int)im : 1; }
+        else if (op == 6) { pc += ((R[b * rs] << sb) < (R[c * rs] << sc)) ? (int)im : 1; }
+        else if (op == 7) { pc += (int)im; }
+        else if (op == 8) {
+            i64 raw = R[b * rs];
+            if (raw >= romlo) {
+                i64 o = raw - romlo; if (o >= romn) { rep = %(r_end)d; break; }
+                R[a * rs] = (i64)ROM[(size_t)o]; pc++;
+            } else {
+                i64 addr = slot(raw, need, work, words); if (addr < 0) { rep = %(r_end)d; break; }
+                R[a * rs] = (i64)M[(size_t)addr * (size_t)lanes + lane]; pc++;
+            }
+        }
+        else if (op == 9) {
+            i64 raw = R[b * rs];
+            if (raw >= romlo) {                    // 共有帯へ書く。ここが接合点
+                i64 o = raw - romlo; if (o >= romn) { rep = %(r_end)d; break; }
+                ROM[(size_t)o] = (u64)R[c * rs];
+                pc++;
+                __threadfence();
+                gbar(cnt, gen, nblocks);
+                continue;
+            }
+            i64 addr = slot(raw, need, work, words); if (addr < 0) { rep = %(r_end)d; break; }
+            M[(size_t)addr * (size_t)lanes + lane] = (u64)R[c * rs]; pc++;
+        }
+        else if (op == 10) { rep = %(r_ok)d; break; }
+        else if (op == 11) { rep = %(r_ko)d; break; }
+        else if (op == 12) { pc++; }
+        else { rep = %(r_end)d; break; }
+    }
+    report[lane] = rep; steps[lane] = n;
+}
+
+// ===== warp を pc の小さい順にそろえて歩く道 =====
+//
+// thread ごとに好きに飛ぶと、warp の中で pc が割れた瞬間から命令が直列になり、
+// 語の読みも散って memory に縛られる(電力 50 W で頭打ち)。
+// 20 §6 命題 6.1: 合流は最も小さい pc から取れば足りる。warp の中で最小の pc を
+// 一つ選び、そこに居る lane だけが一命令進む。分岐で割れても、後ろの lane が
+// 先に追いつくので、loop の出口で自然に合流する。
+
+extern "C" __global__
+void lane64_run1_sync(const i64 *prog, int ninsn, u64 *M, int words, int lanes, i64 budget,
+                      int need, int work, int *report, i64 *steps,
+                      const u64 *ROM, i64 romlo, i64 romn, int stride)
+{
+    // stride は語の帯の中の lane の数(M2 の列数)。lanes はいま走らせる lane の数で、
+    // 先頭から lanes 本だけが歩く。段を長さの順に並べておけば、短い段が終わった後の
+    // 歩は先頭の生きている lane だけで済む
+    extern __shared__ i64 sreg[];
+    int lane = blockIdx.x * blockDim.x + threadIdx.x;
+    bool alive = lane < lanes;
+    i64 *R = sreg + threadIdx.x;
+    const int rs = blockDim.x;
+    int pc = 0; i64 n = 0; int rep = %(r_budget)d;
+    bool done = !alive;
+    while (true) {
+        unsigned live = __ballot_sync(0xffffffffu, !done);
+        if (live == 0) break;
+        int mypc = done ? 0x7fffffff : pc;
+        int pcmin = __reduce_min_sync(0xffffffffu, mypc);
+        if (done || pc != pcmin) continue;
+        n++;
+        if (n > budget) { done = true; continue; }
+        if (pc < 0 || pc >= ninsn) { rep = %(r_end)d; done = true; continue; }
+        const i64 *ins = prog + (size_t)pc * %(fields)d;
+        int op = (int)ins[0], a = (int)ins[1], b = (int)ins[2], c = (int)ins[3];
+        int sb = (int)ins[4], sc = (int)ins[5]; i64 im = ins[6];
+        if (op == 0) { rep = %(r_end)d; done = true; }
+        else if (op == 1) { R[a * rs] = im; pc++; }
+        else if (op == 2) { R[a * rs] = (R[b * rs] << sb) + (R[c * rs] << sc); pc++; }
+        else if (op == 3) {
+            i64 x = R[b * rs], y = R[c * rs];
+            u64 ux = (u64)(x < 0 ? -x : x), uy = (u64)(y < 0 ? -y : y);
+            if (__umul64hi(ux, uy) || ((ux * uy) >> 63)) { rep = %(r_wide)d; done = true; }
+            else { R[a * rs] = x * y; pc++; }
+        }
+        else if (op == 4) { R[a * rs] = -R[b * rs]; pc++; }
+        else if (op == 5) { pc += ((R[b * rs] << sb) == (R[c * rs] << sc)) ? (int)im : 1; }
+        else if (op == 6) { pc += ((R[b * rs] << sb) < (R[c * rs] << sc)) ? (int)im : 1; }
+        else if (op == 7) { pc += (int)im; }
+        else if (op == 8) {
+            i64 raw = R[b * rs];
+            if (raw >= romlo) {
+                i64 o = raw - romlo; if (o >= romn) { rep = %(r_end)d; done = true; }
+                else { R[a * rs] = (i64)ROM[(size_t)o]; pc++; }
+            } else {
+                i64 addr = slot(raw, need, work, words); if (addr < 0) { rep = %(r_end)d; done = true; }
+                else { R[a * rs] = (i64)M[(size_t)addr * (size_t)stride + lane]; pc++; }
+            }
+        }
+        else if (op == 9) {
+            i64 raw = R[b * rs];
+            if (raw >= romlo) { rep = %(r_end)d; done = true; }
+            else {
+                i64 addr = slot(raw, need, work, words); if (addr < 0) { rep = %(r_end)d; done = true; }
+                else { M[(size_t)addr * (size_t)stride + lane] = (u64)R[c * rs]; pc++; }
+            }
+        }
+        else if (op == 10) { rep = %(r_ok)d; done = true; }
+        else if (op == 11) { rep = %(r_ko)d; done = true; }
+        else if (op == 12) { pc++; }
+        else { rep = %(r_end)d; done = true; }
+    }
+    if (alive) { report[lane] = rep; steps[lane] = n; }
+}
+
+extern "C" __global__
+void gather(const u64 *M, int words, int lanes, const int *watch, int nwatch, u64 *out)
+{
+    int lane = blockIdx.x * blockDim.x + threadIdx.x;
+    if (lane >= lanes) return;
+    u64 *o = out + (size_t)lane * nwatch * NLIMB;
+    for (int k = 0; k < nwatch; k++) {
+        const u64 *w = M + ((size_t)watch[k] * NLIMB) * (size_t)lanes + lane;
+        for (int i = 0; i < NLIMB; i++) o[k * NLIMB + i] = w[(size_t)i * lanes];
+    }
+}
+
+// 先頭 lanes 本だけを集める。stride は帯の中の lane の数
+extern "C" __global__
+void gather_s(const u64 *M, int stride, int lanes, const int *watch, int nwatch, u64 *out)
+{
+    int lane = blockIdx.x * blockDim.x + threadIdx.x;
+    if (lane >= lanes) return;
+    u64 *o = out + (size_t)lane * nwatch;
+    for (int k = 0; k < nwatch; k++) o[k] = M[(size_t)watch[k] * stride + lane];
+}
+"""
+
+R_END = 45
+_MOD = {}
+
+
+# ===== block 内の即値を畳む =====
+#
+# commonc が出す lane64 の命令列は、番地を one の倍化と加算で組み立てる。
+# CPU 側の vcpu.translate は block ごとに値を記号で追い、即値どうしの算術を
+# 一つの即値へ畳む(casm.lane64.vn)。GPU の解釈器は命令を一つずつ歩くので、
+# 同じ畳み込みを先に済ませておかないと、番地を綴る鎖がそのまま実行費用になる。
+#
+#   R1 = 1 ; R1 = R1+R1 ; ... ; R2 = R1+R3   →   R1 = 65554 の一命令
+#
+# block の入口で値が分かっている register は無い、として始める。分岐は畳まない。
+
+MAT, ADD, MUL, NEG, EQ, LT, JMP, LD, ST = 1, 2, 3, 4, 5, 6, 7, 8, 9
+_BR = (EQ, LT, JMP)
+_TERM = (0, 10, 11)
+
+
+def leaders(prog):
+    """block の先頭になる命令の番号"""
+    out = set([0])
+    for i, ins in enumerate(prog):
+        op, im = ins[0], ins[6]
+        if op in _BR:
+            out.add(i + int(im))
+            out.add(i + 1)
+        elif op in _TERM:
+            out.add(i + 1)
+    return sorted(a for a in out if 0 <= a < len(prog))
+
+
+def _reads(ins):
+    op = ins[0]
+    if op in (ADD, EQ, LT, MUL):
+        return (ins[2], ins[3])
+    if op in (NEG, LD):
+        return (ins[2],)
+    if op == ST:
+        return (ins[2], ins[3])
+    if op == 12:
+        return (ins[2],)
+    return ()
+
+
+def _writes(ins):
+    op = ins[0]
+    return ins[1] if op in (MAT, ADD, MUL, NEG, LD) else None
+
+
+def _walk(prog, lo, hi, live, dead, rewrite):
+    """block をひと通り追う。live には「自分の Store より前に読んだ定数番地」を集め、
+    rewrite が真なら即値の算術と語への往復を畳み、dead の番地への Store を落とす。"""
+    val, mem = {}, {}
+    for i in range(lo, hi):
+        ins = prog[i]
+        if ins is None:
+            continue
+        op = ins[0]
+        if op == MAT:
+            val[ins[1]] = int(ins[6])
+        elif op in (ADD, MUL, NEG):
+            b, c, sb, sc = ins[2], ins[3], ins[4], ins[5]
+            vb = val.get(b)
+            vc = val.get(c) if op != NEG else 0
+            if vb is not None and vc is not None:
+                v = (vb << sb) + (vc << sc) if op == ADD else (vb * vc if op == MUL else -vb)
+                if rewrite:
+                    prog[i] = [MAT, ins[1], 0, 0, 0, 0, v]
+                val[ins[1]] = v
+            else:
+                val.pop(ins[1], None)
+        elif op == LD:
+            a = val.get(ins[2])
+            if a is not None and a in mem:
+                if rewrite:
+                    prog[i] = [MAT, ins[1], 0, 0, 0, 0, mem[a]]
+                val[ins[1]] = mem[a]
+            else:
+                if a is not None:
+                    live.add(a)
+                val.pop(ins[1], None)
+        elif op == ST:
+            a, v = val.get(ins[2]), val.get(ins[3])
+            if a is None:
+                mem.clear()
+            elif v is None:
+                mem.pop(a, None)
+            else:
+                mem[a] = v
+            # 同じ block の Load は先に繋いでから落とす。落とすのは block を跨ぐ分だけ
+            if rewrite and a is not None and a in dead:
+                prog[i] = None
+        else:
+            w = _writes(ins)
+            if w is not None:
+                val.pop(w, None)
+
+
+def fold(prog, wires=None):
+    """block の中で値を記号で追い、即値どうしの算術と語への往復を畳む。意味は変わらない。
+
+    lane64 の一箱は MAT・ST・LD の往復に開くので、register だけを追っても畳めない。
+    定数番地への Store と、その番地からの Load を繋いで初めて鎖が一つの即値になる。
+    """
+    prog = [list(x) for x in prog]
+    heads = leaders(prog) + [len(prog)]
+
+    # 一巡目。block を跨いで読まれる定数番地を集める
+    live = set()
+    for k in range(len(heads) - 1):
+        _walk(prog, heads[k], heads[k + 1], live, (), False)
+
+    # commonc が出すワイヤの番地は定数だけで、本文の番地は WORK 以上にある。
+    # だから [64, need) のうち誰も跨いで読まない番地への Store は落としてよい
+    dead = set()
+    if wires:
+        lo, hi = wires
+        dead = set(a for a in range(lo, hi) if a not in live)
+
+    # 二巡目。畳んで、死んだ Store を落とす
+    for k in range(len(heads) - 1):
+        lo, hi = heads[k], heads[k + 1]
+        _walk(prog, lo, hi, set(), dead, True)
+    # block の中だけの死んだ書き込みを落とす
+    for k in range(len(heads) - 1):
+        lo, hi = heads[k], heads[k + 1]
+        last, drop = {}, set()
+        for i in range(lo, hi):
+            ins = prog[i]
+            if ins is None:
+                continue
+            for r in _reads(ins):
+                last.pop(r, None)
+            w = _writes(ins)
+            if w is not None:
+                if ins[0] == MAT and w in last:
+                    drop.add(last[w])
+                last[w] = i if ins[0] == MAT else None
+                if last[w] is None:
+                    last.pop(w)
+        for i in drop:
+            prog[i] = None
+    # 落とした分だけ番号が詰まるので、分岐の変位を貼り直す
+    keep = [i for i, x in enumerate(prog) if x is not None]
+    newpos, n = {}, 0
+    for i in range(len(prog)):
+        newpos[i] = n
+        if prog[i] is not None:
+            n += 1
+    newpos[len(prog)] = n
+    out = []
+    for i in keep:
+        ins = list(prog[i])
+        if ins[0] in _BR:
+            ins[6] = newpos[min(i + int(ins[6]), len(prog))] - newpos[i]
+        out.append(tuple(ins))
+    return out
+
+
+def compact(prog, wires, work=0):
+    """ワイヤの番地を詰める。返りは (prog, 新しい need)。
+
+    commonc の一箱はワイヤ一本を語 64 + w に取るので、image が大きいと lane ごとの
+    ワイヤの帯が数万語になる。畳んだ後に生き残る番地はその一部なので、番地として
+    使われている即値だけを 64 から順に付け直す。
+
+    即値が番地か値かは block の中の使われ方で決める。MAT で置いた register が、
+    上書きされるまでに LD / ST の番地としてしか使われなければ番地。値として
+    使われた即値は触らない。触らない即値がワイヤの帯に残れば、need は
+    その最大までしか下がらない(返りの need がそれを示す)。
+    """
+    lo, hi = wires
+    # 二値の八箱の退避語は定数番地の最大の上に置かれ、ワイヤの帯と本文の間の穴に落ちる
+    # ことがある(16 §5.3)。穴は lane に無いので、そこも一緒に詰める
+    hi = max(hi, work) if work else hi
+    prog = [list(x) for x in prog]
+    heads = leaders(prog) + [len(prog)]
+    addr_mats, keep_hi = [], lo
+    for k in range(len(heads) - 1):
+        a, b = heads[k], heads[k + 1]
+        for i in range(a, b):
+            ins = prog[i]
+            if ins[0] != MAT or not (lo <= ins[6] < hi):
+                continue
+            reg, ok, closed = ins[1], True, False
+            for j in range(i + 1, b):
+                jn = prog[j]
+                op = jn[0]
+                if op in (LD, ST) and jn[2] == reg and not (op == ST and jn[3] == reg):
+                    pass
+                elif reg in _reads(jn):
+                    ok = False
+                    break
+                if _writes(jn) == reg:
+                    closed = True
+                    break
+            # block の外へ出る register は次の block でも番地として使われる(commonc は
+            # ワイヤの番地を定数でしか作らない)。値として読まれた即値だけを残す
+            if ok:
+                addr_mats.append(i)
+            else:
+                keep_hi = max(keep_hi, ins[6] + 1)
+    used = sorted(set(prog[i][6] for i in addr_mats))
+    base = keep_hi
+    remap = {a: base + k for k, a in enumerate(used)}
+    for i in addr_mats:
+        prog[i][6] = remap[prog[i][6]]
+    return [tuple(x) for x in prog], base + len(used)
+
+
+def _module(cp, nlimb):
+    if nlimb not in _MOD:
+        src = SRC % {"nlimb": nlimb, "fields": INSN_FIELDS, "r_ok": R_OK, "r_ko": R_KO,
+                     "r_wide": R_WIDE, "r_budget": R_BUDGET, "r_end": R_END}
+        _MOD[nlimb] = cp.RawModule(code=src, options=("-std=c++11",))
+    return _MOD[nlimb]
+
+
+def to_limbs(v, nlimb):
+    """整数を limb の並びへ(二の補数)"""
+    mask = (1 << (64 * nlimb)) - 1
+    x = v & mask
+    return [(x >> (64 * i)) & 0xFFFFFFFFFFFFFFFF for i in range(nlimb)]
+
+
+def from_limbs(limbs, nlimb):
+    x = 0
+    for i, l in enumerate(limbs):
+        x |= int(l) << (64 * i)
+    if x >> (64 * nlimb - 1):
+        x -= 1 << (64 * nlimb)
+    return x
+
+
+_NOROM_BUF = {}
+
+
+def _NOROM(cp):
+    """共有帯を使わないときに渡す一語の置き場。kernel は romlo = 2^62 で触らない"""
+    if "b" not in _NOROM_BUF:
+        _NOROM_BUF["b"] = cp.zeros((1,), dtype=cp.uint64)
+    return _NOROM_BUF["b"]
+
+
+def pack(addr, need, work):
+    """語番号 → 詰めた並びの位置。kernel の slot() と同じ式(式は device 側 §slot)。"""
+    if work == 0:
+        return addr
+    if 0 <= addr < need:
+        return addr
+    return addr - work + need
+
+
+
+def run(prog, seeds, words, watch, nlimb=16, budget=1 << 26, chunk=64, need=0, work=0,
+        base=None):
+    """image(decode 済み)を seeds の lane 分だけ走らせる。
+
+    seeds は lane ごとの {語: 値}、watch は host へ戻す語の並び。
+    返りは lane ごとの (報告, {語: 値})。報告は 0 = tu、42 = te、43 = 幅を越えた、44 = 歩数の上限。
+
+    base は全 lane へ同じ値を置く語({語: 値})。模型の表のように lane ごとに同じ物を
+    渡すとき、seeds へ毎回入れると host の側だけで lane × 語 の手間になる。ここでは
+    語ごとに一度だけ device の帯へ書くので、手間は語の数で済む。
+
+    need と work を渡すと、ワイヤ(0 .. need)と本文の作業領域(work 以上)の間の穴を詰める。
+    commonc の lane64 版は本文を WORK = 2^16 から置くので、詰めないと lane ごとに
+    65536 語ぶんの空きを確保することになる(20 §1.2 の lane の作業領域は交わらない)。
+
+        words = need + (本文が使う語の数)
+
+    穴を詰めると lane あたりの領域が減り、同じ memory でより多くの lane を並べられる。
+    """
+    import cupy as cp
+    mod = _module(cp, nlimb)
+    k_run = mod.get_function("lane64_run1" if nlimb == 1 else "lane64_run")
+    k_gather = mod.get_function("gather")
+    prog = fold(prog)
+    table = np.array([list(p) for p in prog], dtype=np.int64).reshape(-1)
+    d_prog = cp.asarray(table)
+    d_watch = cp.asarray(np.array([pack(w, need, work) for w in watch], dtype=np.int32))
+    out = []
+    for start in range(0, len(seeds), chunk):
+        part = seeds[start:start + chunk]
+        lanes = len(part)
+        M = cp.zeros((lanes * words * nlimb,), dtype=cp.uint64)
+        if base:
+            for addr, v in base.items():
+                a = pack(addr, need, work)
+                v = int(v)
+                if 0 <= v < (1 << 63):
+                    M[(a * nlimb) * lanes:(a * nlimb) * lanes + lanes] = np.uint64(v)
+                else:
+                    for i, limb in enumerate(to_limbs(v, nlimb)):
+                        if limb:
+                            o = (a * nlimb + i) * lanes
+                            M[o:o + lanes] = np.uint64(limb)
+        idx, vals = [], []
+        for l, seed in enumerate(part):
+            for addr, v in seed.items():
+                a = pack(addr, need, work)
+                v = int(v)
+                if 0 <= v < (1 << 63):
+                    idx.append((a * nlimb) * lanes + l)
+                    vals.append(v)
+                else:
+                    for i, limb in enumerate(to_limbs(v, nlimb)):
+                        if limb:
+                            idx.append((a * nlimb + i) * lanes + l)
+                            vals.append(limb)
+        if idx:
+            M[cp.asarray(np.array(idx, dtype=np.int64))] = cp.asarray(np.array(vals, dtype=np.uint64))
+        report = cp.zeros((lanes,), dtype=cp.int32)
+        steps = cp.zeros((lanes,), dtype=cp.int64)
+        threads = 128
+        grid = (lanes + threads - 1) // threads
+        sh = threads * NREG_BYTES if nlimb == 1 else 0
+        k_run((grid,), (threads,), (d_prog, np.int32(len(prog)), M, np.int32(words), np.int32(lanes),
+                                    np.int64(budget), np.int32(need), np.int32(work), report, steps,
+                                    _NOROM(cp), np.int64(1 << 62), np.int64(0)),
+              shared_mem=sh)
+        got = cp.zeros((lanes * len(watch) * nlimb,), dtype=cp.uint64)
+        if watch:
+            k_gather((grid,), (threads,), (M, np.int32(words), np.int32(lanes), d_watch, np.int32(len(watch)), got))
+        rep = report.get()
+        raw = got.get()
+        for l in range(lanes):
+            vals_l = {}
+            for k, w in enumerate(watch):
+                o = (l * len(watch) + k) * nlimb
+                vals_l[w] = from_limbs(raw[o:o + nlimb], nlimb)
+            out.append((int(rep[l]), vals_l))
+        del M, got
+    return out
+
+
+def run_shared(prog, base, lanes, words, watch, need, work, nlimb=4, budget=1 << 26,
+               chunk=2048, romlo=None, romn=0):
+    """lane が共有する種 base に、lane ごとの少しの語 lanes[k] を重ねて走らせる。
+
+    語の並びは詰める: ワイヤ [0, need) をそのまま、作業領域 [work, ...) を need の後ろに置く。
+    words は詰めた後の語数(need + 作業領域の幅)。平文の側の語は全部 work 以上にあるので、
+    間の番地は使われない。返りは lane ごとの (報告, {語: 値})。
+
+    romlo を渡すと、番地 [romlo, romlo + romn) は**全 lane で一枚だけ**持つ。
+    読むだけの表(値段の表など)をここへ置くと、lane あたりの重さが桁で落ちる。
+
+        lane あたりの語数 = need + (romlo - work)
+        共有帯の語数     = romn
+
+    この帯へ Store すると報告 45 で止まる。書く語を入れてはいけない。
+    """
+    import cupy as cp
+    mod = _module(cp, nlimb)
+    k_run = mod.get_function("lane64_run1" if nlimb == 1 else "lane64_run")
+    k_gather = mod.get_function("gather")
+    prog = fold(prog, wires=(64, need))
+    table = np.array([list(p) for p in prog], dtype=np.int64).reshape(-1)
+    d_prog = cp.asarray(table)
+    hi = romlo if romlo is not None else (1 << 62)
+
+    def pos(a):
+        return a if a < need else a - work + need
+
+    d_watch = cp.asarray(np.array([pos(w) for w in watch], dtype=np.int32))
+    # 共有の種を一枚の並びにする。共有帯の分は別の並びへ分ける
+    row = np.zeros((words * nlimb,), dtype=np.uint64)
+    rom = np.zeros((max(1, romn) * nlimb,), dtype=np.uint64)
+    for addr, v in base.items():
+        v = int(v)
+        p0 = (addr - hi) * nlimb if addr >= hi else pos(addr) * nlimb
+        dst = rom if addr >= hi else row
+        if 0 <= v < (1 << 63):
+            dst[p0] = v
+        else:
+            for i, limb in enumerate(to_limbs(v, nlimb)):
+                dst[p0 + i] = limb
+    d_row = cp.asarray(row)
+    d_rom = cp.asarray(rom)
+    out = []
+    for start in range(0, len(lanes), chunk):
+        part = lanes[start:start + chunk]
+        n = len(part)
+        M = cp.repeat(d_row, n)
+        idx, vals = [], []
+        for l, seed in enumerate(part):
+            for addr, v in seed.items():
+                idx.append((pos(addr) * nlimb) * n + l)
+                vals.append(int(v))
+        if idx:
+            M[cp.asarray(np.array(idx, dtype=np.int64))] = cp.asarray(np.array(vals, dtype=np.uint64))
+        report = cp.zeros((n,), dtype=cp.int32)
+        steps = cp.zeros((n,), dtype=cp.int64)
+        threads = 128
+        grid = (n + threads - 1) // threads
+        sh = threads * NREG_BYTES if nlimb == 1 else 0
+        k_run((grid,), (threads,), (d_prog, np.int32(len(prog)), M, np.int32(words), np.int32(n),
+                                    np.int64(budget), np.int32(need), np.int32(work), report, steps,
+                                    d_rom, np.int64(hi), np.int64(romn)),
+              shared_mem=sh)
+        got = cp.zeros((n * len(watch) * nlimb,), dtype=cp.uint64)
+        k_gather((grid,), (threads,), (M, np.int32(words), np.int32(n), d_watch, np.int32(len(watch)), got))
+        rep = report.get()
+        raw = got.get().reshape(n, len(watch), nlimb)
+        for l in range(n):
+            out.append((int(rep[l]), dict((w, from_limbs(raw[l, k], nlimb)) for k, w in enumerate(watch))))
+        del M, got
+    return out
+
+
+
+class Lanes(object):
+    """lane の作業領域と共有帯を device に置いたまま、image を何度も流す。
+
+    host は語を一つずつ触らない。種は (lane, 語, 値) の並びを一度に散らし、読みは
+    (lane × 語) の並びを一度に集める。どちらも cupy の一手で済むので、lane の数にも
+    語の数にも Python の反復が付かない。
+
+        L = Lanes(prog, need, work, romlo, romn, nlanes, base={語: 値})
+        L.put(lanes, addrs, vals)          種を散らす(三つとも同じ長さの並び)
+        L.rom_put(offset, values)          共有帯の一部を書く
+        rep, W = L.run(watch)              rep[lane] が報告、W[lane, k] が watch[k] の値(device)
+        L.M2                               語 × lane の二次元の眺め(device)
+        L.reset()                          作業領域を base の並びへ戻す
+
+    語の並びは run_shared と同じ: ワイヤ [0, need) をそのまま、作業領域 [work, romlo) を
+    need の後ろに詰める。M は語主で M2[pos(語), lane]。
+
+    共有帯 rom は cupy の並び一枚。別の Lanes の M をそのまま rom に渡せる(rom=)ので、
+    lane の畳みのように「全 lane の語を読む」kernel は、その M を共有帯として読めば書ける。
+    """
+
+    def __init__(self, prog, need, work, romlo, romn, nlanes, base=None, nlimb=1, rom=None, sync=True):
+        """sync が真なら warp を pc の小さい順にそろえて歩く(lane64_run1_sync)。"""
+        import cupy as cp
+        self.cp = cp
+        if nlimb != 1:
+            raise ValueError("Lanes は 64 bit の語だけを扱う(nlimb=1)")
+        self.need, self.work, self.romlo = need, work, romlo
+        self.words = need + (romlo - work)
+        self.n = nlanes
+        mod = _module(cp, 1)
+        self.sync = sync
+        self.k_run = mod.get_function("lane64_run1_sync" if sync else "lane64_run1")
+        self.k_gather = mod.get_function("gather_s")
+        prog = fold(prog, wires=(64, need))
+        prog, need = compact(prog, (64, need), work=work)
+        self.need = need
+        self.words = need + (romlo - work)
+        self.nprog = len(prog)
+        self.d_prog = cp.asarray(np.array([list(p) for p in prog], dtype=np.int64).reshape(-1))
+        if rom is not None:
+            self.d_rom = rom
+            self.romn = int(rom.size)
+        else:
+            self.romn = romn
+            self.d_rom = cp.zeros((max(1, romn),), dtype=cp.uint64)
+        row = np.zeros((self.words,), dtype=np.uint64)
+        for addr, v in (base or {}).items():
+            row[self.pos(addr)] = int(v)
+        self.d_row = cp.asarray(row)
+        self.M = cp.zeros((self.words * nlanes,), dtype=cp.uint64)
+        self.reset()
+
+    def pos(self, a):
+        return a if a < self.need else a - self.work + self.need
+
+    @property
+    def M2(self):
+        return self.M.reshape(self.words, self.n)
+
+    def reset(self):
+        self.M2[:, :] = self.d_row.reshape(-1, 1)
+
+    def put(self, lanes, addrs, vals):
+        """(lane, 語, 値) の並びを一度に散らす。addrs は語番号(pos は中で当てる)。"""
+        cp = self.cp
+        lanes = cp.asarray(np.asarray(lanes, dtype=np.int64))
+        addrs = np.asarray(addrs, dtype=np.int64)
+        addrs = np.where(addrs < self.need, addrs, addrs - self.work + self.need)
+        idx = cp.asarray(addrs) * self.n + lanes
+        self.M[idx] = cp.asarray(np.asarray(vals, dtype=np.uint64))
+
+    def put_block(self, addr, block):
+        """語 addr から続く語の帯へ、(語数 × lane) の並びを一度に置く。block は device でも host でもよい。"""
+        cp = self.cp
+        b = cp.asarray(block, dtype=cp.uint64)
+        self.M2[self.pos(addr):self.pos(addr) + b.shape[0], :] = b
+
+    def get_block(self, addr, n):
+        """語 addr から n 語の帯を (n × lane) で返す(device)。"""
+        return self.M2[self.pos(addr):self.pos(addr) + n, :]
+
+    def rom_put(self, offset, values):
+        self.d_rom[offset:offset + len(values)] = self.cp.asarray(np.asarray(values, dtype=np.uint64))
+
+    def run(self, watch=(), budget=1 << 36, active=None):
+        """先頭 active 本の lane を走らせる(省くと全部)。返りは (報告, watch の値) で、どちらも active 本ぶん。"""
+        cp = self.cp
+        n = self.n if active is None else min(active, self.n)
+        report = cp.zeros((n,), dtype=cp.int32)
+        steps = cp.zeros((n,), dtype=cp.int64)
+        threads = 128
+        grid = (n + threads - 1) // threads
+        if self.sync:
+            args = (self.d_prog, np.int32(self.nprog), self.M, np.int32(self.words), np.int32(n),
+                    np.int64(budget), np.int32(self.need), np.int32(self.work), report, steps,
+                    self.d_rom, np.int64(self.romlo), np.int64(self.romn), np.int32(self.n))
+        else:
+            if n != self.n:
+                raise ValueError("先頭だけを走らせるには sync の道が要る")
+            args = (self.d_prog, np.int32(self.nprog), self.M, np.int32(self.words), np.int32(n),
+                    np.int64(budget), np.int32(self.need), np.int32(self.work), report, steps,
+                    self.d_rom, np.int64(self.romlo), np.int64(self.romn))
+        self.k_run((grid,), (threads,), args, shared_mem=threads * NREG_BYTES)
+        W = None
+        if watch:
+            d_watch = cp.asarray(np.array([self.pos(w) for w in watch], dtype=np.int32))
+            got = cp.zeros((n * len(watch),), dtype=cp.uint64)
+            self.k_gather((grid,), (threads,), (self.M, np.int32(self.n), np.int32(n), d_watch,
+                                                np.int32(len(watch)), got))
+            W = got.reshape(n, len(watch)).astype(cp.int64)
+        return report.get(), W
Index: trunk/runtime/joinrank.bin
===================================================================
trunk/runtime/joinrank.bin
new file mode 100644
--- a/trunk/runtime/joinrank.bin	(nonexistent)
+++ b/trunk/runtime/joinrank.bin	(revision 2)
@@ -0,0 +1,1461 @@
+@	@@A	AAB	BBC	D	CDE	F	FFG	GGH	HHI	IIJ	JJK	KKL	LLM	MMN	NNO	P	PPQ	QQR	RRS	SST	TTU	UUV	VVW	WWX	XXY	Z	[	[[\	\\]	]]^	^^_	__`	``a	aab	bbc	ccd	dde	eef	ffg	ggh	hhi	iij	k	jkl	llm	mZ	o	oop	opq	r	rrs	sst	ttu	uuv	vvw	wwx	xxy	yyz	zz{	{{|	||}	}}~		~�	���	���	���	���	�q	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	���	��	�	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	�		 			�							��������		
+	
+
+																		 	 	"	""#	"#$	%	%%&	&&'	''(	(()	))*	**+	++,	,,-	--.	../	//0	001	2	123	334	445	556	667	7$	9	99:	::;	;;<	<<=	==>	>>?	??@	@@A	AAB	BBC	CCD	DDE	EEF	FFG	GGH	I	HIJ	JJK	L	KLM	MN	NNO	P	PPQ	QQR	RRS	SST	TTU	UUV	VVW	WWX	XXY	YYZ	ZZ[	[[\	\\]	]]^	^^_	`	_`a	aab	c	bcd	dO	f	ffg	ggh	hhi	iij	jjk	kkl	llm	mmn	nno	oop	ppq	qqr	s	rst	ttu	uuv	vvw	wwx	xy	z	yz{	|	||}	}}~	~~	�	���	���	���	���	���	���	���	���	�	���	���	���	���	���	�{	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	��	���	���	�	 �	�	��	��	�	��	��	�	��"��������	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	��	��													
+	
+
+		
+	
+
+																		 	  !	!!"	""#	##$	$$%	%%&	&&'	(	(()	()*	+	++,	,,-	--.	../	//0	001	112	223	334	445	556	667	8	789	99:	::;	;;<	=	<=>	>>?	?*	A	AAB	BBC	CCD	DDE	EEF	FFG	GGH	HHI	IIJ	JJK	L	KLM	MMN	NNO	OOP	PPQ	QQR	RRS	T	TTU	UUV	VVW	WWX	XXY	YYZ	ZZ[	[[\	\\]	]]^	^^_	__`	a	`ab	bbc	ccd	dde	f	efg	ggh	hi	iSj	jk	l	llm	mmn	o	nop	ppq	qqr	rrs	t	stu	uuv	w	vwx	xxy	z	yz{	{{|	}	|}~	~~	�	��	���	���	���	�	���	���	���	���	���	���	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	�	���	���	��	���	�k	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	�	���	���	��	�	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	��	�	 			��					+�������		
+	
+
+		
+	
+
+																		 	 		"	""#	"#$	%	%%&	&&'	''(	(()	))*	**+	++,	,,-	--.	../	//0	001	2	123	334	445	556	667	7$	9	99:	9:;	<	<<=	==>	>>?	??@	@@A	AAB	BBC	CCD	DDE	EEF	FFG	GGH	I	HIJ	JJK	KKL	M	LMN	NNO	P	OPQ	QQR	S	RST	T;	V	VVW	VWX	Y	YYZ	ZZ[	[[\	\\]	]]^	^^_	__`	``a	aab	bbc	ccd	dde	f	efg	ggh	i	hij	jjk	kkl	llm	mX	o	oop	ppq	r	qrs	sst	ttu	uuv	w	vwx	xxy	z	yz{	{{|	}	|}~	~~	�	��	���	�	���	���	���	���	�	���	���	���	���	���	���	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	�	���	���	�	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	�	���	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	���	���	��	���	��	�	���	���	�	���	���	���	���	�	���	���	�	���	���	�	���	���	�	���	���	�	���	���	���	���	�	���	���	���	���	���	���	���	�	���	���	��											
+		
+		
+		
+								�									 	  !	!!"	""#	##$	%	$%&	&&'	(	'()	))*	**+	++,	,-	-.	./	/�0	1	112	223	334	445	556	667	778	889	99:	::;	;;<	<<=	>	=>?	??@	@@A	AAB	C	BCD	DDE	F	EFG	G0	I	IIJ	JJK	L	KLM	MMN	NNO	OOP	Q	PQR	RRS	T	STU	UUV	W	VWX	XXY	Z	YZ[	[[\	]	\]^	^^_	__`	``a	b	abc	ccd	dde	eef	ffg	ggh	hhi	j	jjk	kkl	llm	mmn	nno	oop	ppq	qqr	rrs	sst	ttu	uuv	w	vwx	xxy	yyz	{	z{|	||}	~	}~	�	�	���	��	�i�	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	�	���	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	���	���	��	���	��	�	���	���	�	���	���	���	���	�	���	���	�	���	���	�	���	���	�	���	���	�	���	���	���	���	�	���	���	���	���	���	���	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	�	���	���	�	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	��								�				�
+			
+	
+
+																		 	 !	!"	""#	##$	$
+%	&	&&'	''(	)	()*	**+	++,	,,-	.	-./	//0	1	012	223	4	345	556	7	678	889	:	9:;	;;<	<<=	==>	?	>?@	@@A	AAB	BBC	CCD	DDE	EEF	G	GGH	HHI	IIJ	JJK	KKL	LLM	MMN	NNO	OOP	PPQ	QQR	RRS	T	STU	UUV	VVW	X	WXY	YYZ	[	Z[\	\\]	^	]^_	_`	`Fa	b	bbc	ccd	dde	eef	ffg	ggh	hhi	iij	jjk	kkl	llm	mmn	o	nop	ppq	qqr	s	rst	ttu	v	uvw	wwx	xy	yaz	{	{{|	||}	}}~	~~	�	���	���	���	���	���	���	���	�	���	���	�	���	���	���	���	��	�z�	�%	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	���	���	��	�	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	�	���	���	��	�	 �	�	��	��	�	��	��	�	��Q��������	���	���	���	���	���	���	��											
+		
+		
+	
+																		 	 !	!!"	""#	$	#$%	%%&	'	&'(	(()	)*	**+	+,	-	--.	../	//0	001	112	223	334	445	556	667	778	889	:	9:;	;;<	<<=	>	=>?	??@	A	@AB	BBC	D	CDE	E,	G	GGH	HHI	IIJ	JJK	KKL	LLM	MMN	NNO	OOP	PPQ	QQR	RRS	T	STU	UUV	VVW	X	WXY	YYZ	[	Z[\	\\]	^	]^_	_`	a	aab	bbc	ccd	dde	eef	ffg	ggh	hhi	iij	jjk	kkl	llm	mmn	nno	p	opq	qqr	s	rst	ttu	uv	w	 x	y	xy	`v	|	x|	x~		~|��������	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	�	���	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	���	��	�	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	��			 			�					
+		
+h�������	
+	
+
+																		 	!	!!"	!"#	$	$$%	%%&	&&'	''(	(()	))*	**+	++,	,,-	--.	../	//0	001	112	3	234	445	556	6#	8	9	99:	::;	;;<	<<=	==>	>>?	??@	@@A	AAB	BBC	CCD	DDE	EEF	FFG	H	GHI	IIJ	JJK	L	KLM	M8	O	OOP	OPQ	R	RRS	SST	TTU	UUV	VVW	WWX	XXY	YYZ	ZZ[	[[\	\\]	]]^	^^_	__`	a	`ab	bbc	d	cde	eef	g	fgh	hQ	j	jjk	jkl	m	mmn	nno	oop	ppq	qqr	rrs	sst	ttu	uuv	vvw	wwx	xxy	yyz	{	z{|	||}	}}~	~~	l	�	���	���	�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	�	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	�	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	��													
+	
+
+		
+	
+
+																		 	  !	"	!"#	##$	$$%	%%&	&&'	(	'()	))*	**+	++,	,,-	--.	../	0	001	112	223	334	445	556	667	778	889	99:	::;	;;<	<<=	>	=>?	??@	@@A	AAB	C	BCD	DE	E/F	F	H	HHI	IIJ	JJK	KKL	LLM	MMN	NNO	OOP	PPQ	QQR	RRS	SST	TTU	V	UVW	WWX	XXY	YYZ	[	Z[\	\]	^	]^_	`	``a	aab	bbc	ccd	dde	eef	ffg	ggh	hhi	iij	jjk	kkl	llm	n	mno	oop	ppq	qqr	s	rst	t_	v	vvw	wwx	xxy	yyz	zz{	{{|	||}	}}~	~~	�	���	���	���	�	���	���	���	���	�	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	��	�	 �	�	��	��	�	��	��	�	��A��������	���	�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	�	���	���	��	�	���	���	�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	��	�	���	���	�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	���	��	�	���	���	�	���	���	���	���	��																																								
+		
+	
+									
+				
+					�																																																							 			 	!		!	!	"		"	"	#		#	#	$		$	$	%		%	%	&		&	&	'		(		(	(	)		)	)	*		*	*	+		+	+	,		,	,	-		-	-	.		.	.	/		/	/	0		0	0	1		1	1	2		2	2	3		3	3	4		4	4	5		6		5	6	7		7	7	8		8	8	9		:		9	:	;		;	;	<		<	=		>		>	>	?		?	?	@		@	@	A		A	A	B		B	B	C		C	C	D		D	D	E		E	E	F		F	F	G		G	=	H		H	'	I		J		J	J	K		K	K	L		L	L	M		M	M	N		N	N	O		O	O	P		P	P	Q		Q	Q	R		R	R	S		S	S	T		T	T	U		U	U	V		V	V	W		X		W	X	Y		Y	Y	Z		Z	Z	[		[	[	\		]		\	]	^		^	_		_	I	`		`	a		b		b	b	c		c	c	d		d	d	e		e	e	f		f	f	g		g	g	h		i		h	i	j		j	j	k		k	k	l		l	l	m		m	m	n		o		n	o	p		p	p	q		q	q	r		r	r	s		s	s	t		t	t	u		u	u	v		w		w	w	x		x	x	y		y	y	z		z	z	{		{	{	|		|	|	}		}	}	~		~	~					�		�	�	�		�	�	�		�	�	�		�	�	�		�		�	�	�		�	�	�		�	�	�		�	�	�		�		�	�	�		�	�		�	v	�		�	�		�	a	�		�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�		�	�	�		�	�	�		�	�	�		�	�	�		�		�	�	�		�	�	�		�		�	�	�		�	�		�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�		�	�	�		�	�	�		�		�	�	�		�	�	�		�	�	�		�	�	�		�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�		�	�	�		�	�	�		�	�	�		�		�	�	�		�	�	�		�	�		�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�		�	�	�		�	�	�		�	�	�		�	�	�		�		�	�	�		�	�		�	�	�		�	�		�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		�	�	�		
+	�	
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+	
+
+
+	
+
+
+	
+
+	
+		
+	
+
+
+	
+
+
+
+
+	
+
+
+	
+
+
+	
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+	
+
+
+	
+
+
+	
+
+
+	
+
+ 
+	!
+	 
+!
+"
+	"
+#
+	#
+
+$
+	$
+%
+	%
+�	&
+	'
+	'
+'
+(
+	(
+(
+)
+	)
+)
+*
+	*
+*
++
+	+
++
+,
+	,
+,
+-
+	-
+-
+.
+	.
+.
+/
+	/
+/
+0
+	0
+0
+1
+	1
+1
+2
+	2
+2
+3
+	4
+	3
+4
+5
+	5
+5
+6
+	6
+6
+7
+	7
+7
+8
+	9
+	8
+9
+:
+	:
+:
+;
+	<
+	;
+<
+=
+	=
+>
+	>
+>
+?
+	?
+?
+@
+	@
+&
+A
+	B
+	B
+B
+C
+	C
+C
+D
+	D
+D
+E
+	E
+E
+F
+	F
+F
+G
+	G
+G
+H
+	H
+H
+I
+	I
+I
+J
+	J
+J
+K
+	K
+K
+L
+	L
+L
+M
+	M
+M
+N
+	O
+	N
+O
+P
+	P
+P
+Q
+	Q
+Q
+R
+	R
+R
+S
+	S
+S
+T
+	U
+	T
+U
+V
+	V
+A
+	X
+	X
+X
+Y
+	Y
+Y
+Z
+	Z
+Z
+[
+	[
+[
+\
+	\
+\
+]
+	]
+]
+^
+	^
+^
+_
+	_
+_
+`
+	`
+`
+a
+	a
+a
+b
+	b
+b
+c
+	c
+c
+d
+	d
+d
+e
+	f
+	e
+f
+g
+	g
+g
+h
+	i
+	h
+i
+j
+	j
+j
+k
+	k
+k
+l
+	l
+m
+	n
+	n
+n
+o
+	o
+o
+p
+	p
+p
+q
+	q
+q
+r
+	r
+r
+s
+	s
+s
+t
+	t
+t
+u
+	u
+u
+v
+	v
+v
+w
+	w
+w
+x
+	x
+x
+y
+	y
+y
+z
+	{
+	z
+{
+|
+	|
+|
+}
+	}
+}
+~
+	~
+~
+
+	
+
+�
+	�
+	�
+�
+�
+	�
+�
+	�
+m
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+	�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+	�
+	 �
+	�
+	�
+�
+	�
+�
+	�
+	�
+�
+	�
+�
+	�
+	�
+�
+���������
+	�
+�
+													
+	
+
+		
+	
+								 										 	  !	!!"	""#	##$	$$%	%%&	&&'	''(	(()	))*	**+	++,	-	,-.	../	//0	1	012	223	334	5	456	6	8	889	99:	::;	;;<	<<=	==>	>>?	??@	@@A	AAB	BBC	CCD	DDE	F	EFG	GGH	HHI	J	IJK	KKL	LM	N	NNO	OOP	PPQ	QQR	RRS	SST	TTU	UUV	VVW	WWX	XXY	YYZ	ZZ[	\	[\]	]]^	_	^_`	``a	b	abc	ccd	de	eef	fMg	h	hhi	iij	jjk	kkl	llm	mmn	nno	oop	ppq	qqr	rrs	sst	u	tuv	vvw	wwx	y	xyz	zz{	{{|	}	|}~	~	g�	�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	�	���	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	��	�	���	�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	��	�	���	���	���	���	���	���	���	���	���	��												
+	
+		 
+		
+	�		
+	
+		��������										 	  !	!!"	""#	$	#$%	%%&	'	&'(	(()	*	)*+	++,	,-	.	../	./0	1	 2	3	23	-0	6	26	28	9	99:	::;	;;<	<<=	==>	>>?	??@	@@A	AAB	BBC	CCD	DDE	EEF	G	FGH	HHI	J	IJK	KKL	M	LMN	NNO	P	OPQ	Q8	S	T	TTU	UUV	VVW	WWX	XXY	YYZ	ZZ[	[[\	\\]	]]^	^^_	__`	``a	b	abc	ccd	e	def	ffg	h	ghi	iij	k	jkl	lm	mmn	nSo	p	ppq	qqr	rrs	sst	ttu	uuv	vvw	wwx	xxy	yyz	zz{	{{|	||}	~	}~	�	�	���	���	���	�	���	�o	�	���	���	���	���	���	���	���	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	��	�	 �	�	��	��	�	��	��	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	���	��	�	���	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	�	���	��	�	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	�	���	���	���	��	���	���	�	���	���	���	���	���	���	���	���	���	���	��
+	
+
+
+	
+
+
+	
+	
+
+
+	
+
+
+	
+	
+
+
+	
+
+
+	
+
+	
+	
+
+		
+
+
+
+	
+
+	
+�
+
+	
+
+�
+	
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+
+
+	
+	
+
+
+	
+
+ 
+	!
+	 
+!
+"
+	"
+"
+#
+	$
+	#
+$
+%
+	%
+
+	'
+	'
+'
+(
+	(
+(
+)
+	)
+)
+*
+	*
+*
++
+	+
++
+,
+	,
+,
+-
+	-
+-
+.
+	.
+.
+/
+	/
+/
+0
+	0
+0
+1
+	1
+1
+2
+	2
+2
+3
+	3
+3
+4
+	5
+	4
+5
+6
+	6
+6
+7
+	8
+	7
+8
+9
+	9
+9
+:
+	:
+:
+;
+	<
+	;
+<
+=
+	=
+>
+	?
+	?
+?
+@
+	@
+@
+A
+	A
+A
+B
+	B
+B
+C
+	C
+C
+D
+	D
+D
+E
+	E
+E
+F
+	F
+F
+G
+	G
+G
+H
+	H
+H
+I
+	I
+I
+J
+	J
+J
+K
+	L
+	K
+L
+M
+	M
+M
+N
+	N
+N
+O
+	P
+	O
+P
+Q
+	Q
+Q
+R
+	R
+R
+S
+	S
+T
+	T
+>
+U
+	V
+	V
+V
+W
+	W
+W
+X
+	X
+X
+Y
+	Y
+Y
+Z
+	Z
+Z
+[
+	[
+[
+\
+	\
+\
+]
+	]
+]
+^
+	^
+^
+_
+	_
+_
+`
+	`
+`
+a
+	a
+a
+b
+	b
+b
+c
+	d
+	c
+d
+e
+	e
+e
+f
+	g
+	f
+g
+h
+	h
+h
+i
+	i
+i
+j
+	k
+	j
+k
+l
+	l
+U
+	n
+	n
+n
+o
+	n
+o
+p
+	q
+	q
+q
+r
+	r
+r
+s
+	s
+s
+t
+	t
+t
+u
+	u
+u
+v
+	v
+v
+w
+	w
+w
+x
+	x
+x
+y
+	y
+y
+z
+	z
+z
+{
+	{
+{
+|
+	|
+|
+}
+	}
+}
+~
+	
+	~
+
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+p
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+	�
+�
+�
+	�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+�
+�
+	�
+	�
+�
+�
+	�
+�
+													
+	
+
+		
+	
+
+																�
+		 	  !	!!"	""#	##$	$$%	%%&	&&'	''(	(()	))*	**+	,	+,-	--.	../	//0	1	012	223	4	345	5	7	778	889	99:	::;	;;<	<<=	>	=>?	??@	A	@AB	BBC	CCD	DDE	F	EFG	GGH	HHI	IIJ	JJK	KKL	LLM	N	NNO	OOP	PPQ	QQR	RRS	SST	TTU	UUV	VVW	WWX	XXY	YYZ	ZZ[	\	[\]	]]^	^^_	`	_`a	aab	bc	d	dde	eef	ffg	ggh	hhi	iij	jjk	kkl	llm	mcn	nMo	p	ppq	qqr	rrs	sst	ttu	uuv	vvw	wwx	xxy	yyz	zz{	{{|	||}	~	}~	�	���	���	�	���	��	�o�	��	�	���	���	���	���	���	���	�	���	���	���	���	���	�	���	���	���	���	���	���	���	�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	�	���	��	���	��	���	�	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	���	���	�	���	���	�	���	��	���	���	���	�	���	���	���	���	���	���	���	���	���	���	���	���	���	�	���	���	�	���	���	���	�	���	��	���	�	���	���	���	���	���	���	�	���	���	�	���	���	���	���	�	���	���	���	���	���	���	��													
+	
+
+		
+	
+
+																		 	  !	!!"	""#	##$	$$%	&	%&'	''(	(()	*	)*+	+,	,-	.	../	//0	001	112	223	334	445	556	667	7-8	89	:	:

差分が大きいため途中までを表示しています。