- 最后登录:
- -
- 阅读权限:
- 30
- 主题数:
- 27
- 总积分:
- 3881
- 回帖数:
- 84
- 精华数:
- 0
-
EU:6
RF:3326
Vis:6
Mana:0
AE:967
|
设计好了
首先是我们的设计观念:
CPU指AE2模组的CPU,Crafting Process Unit,用于存储进程。由于AE2的CPU的进程树是静态的,无法应对流控制,所以我们需要添加一个流控制器。
流控制器叙述比较麻烦,后面解释之前说用CPU当作任务栈,那么自然得有处理模板、ME接口,以及接受ME接口数据并处理的设备。我称之为数据运输器。
数据运输器负责根据参数,将一个【地址】中的数据,复制到另一个【地址】中,通过ME-IO端口实现。
【地址】则对应的是广义的存储设备:内存、输入仓、输出仓、基础计算单元输入接口、基础计算单元输出接口、寄存器等。
寄存器由32个ME箱子组成,分别作为第一级容器,最快,和其它的【输入仓】【内存整体】等同一等级。
基础运算单元则同样,其接口同样是第一级容器。
内存整体、输入输出仓、流控制器则访问要慢一点。
例如,30个A物品,寻址,到第31个ME箱子
假如有8个基础运算单元接口,37则寻址到第6个基础运算单元,
40则寻址到输入仓,连接输入仓整体,再查看B物品的数量,搜寻具体目标输入仓。(可能是输出仓,内存等,不确定)
提供常数库:
0、1、2、4、8、16、32、64、128、256,与寄存器同级。
数据运输器和CPU网络:
操作ID:重命名圆石
地址表示:重命名沙石
流控制操作ID:重命名石头
实值和占位符:重命名铁锭
复制数据模板:地址1+地址2+上一个操作的ID=这一个操作的ID
流控制模板:上一个操作的ID(一般为将1 给到 流控制单元启动器)= 流控制操作ID
在写流控制之前,需要:将bool值给到流控制单元判断器,将1给到流控制单元启动器。
*触发流控制之后要重置所有CPU或者流控制完成后,只留下唯一一个新增运行中的和一个空闲的连入网络。
为了处理递归只应当把移除栈顶。连接所有CPU会变成队列而非栈!
CPU网络存储系统:操作用的表示地址的元件存在低优先级中、一个只写存储总线,不断输入(伪合成)。
基础运算单元则目前计划有:
*通用:
M位置是模式控制,设置为1则开始运算,变为0则允许输出。
*因此基础运算单元应该在【数据运输器】操作的ME-IO端口附近。
"|"后为输出,前为输入。
*符号:
0->A:将X的物品清空
A->B:将X的物品导入Y
I->A :将A灌满占位符
S(A):A对256取模
!256表示剩下能放256个实值物品的元件
注意:
运算器内置常数256和!256
对256取一次模的实现:如果X>=256,则X->!256
处理器:
小于?(A,B|C):I->A,将A中的占位符导到B,A中仍有占位符则A<B,输出为1,反之输出为0,M=0;
加法+ (A,B|C):clear(C),A->C,B->C,S(C),当C从>=256变成<256时,M=0。
减法 - (A,B|C):clear(C),C+=256,A->C,I->B,B的实值物品清空,C->B,S(C),当C从>=256变成<256时,M=0。
取模%(A,B|C):
循环执行直到A空:
扔掉上一个单元x。
B灌满,占位符给到新的单元x,单元x抽取A中物品。
将最后一个单元x中的实值物品给到C,M=0。
取较小值min(A,B|C):I->A,A排出实值物品,B->A,A排出实值物品至C,M=0。
取较大值max(A,B|C):I->B,B占位符出至A,B->A,A排除实值至C,M=0。
<=To be continued
流控制器:
1、流控制器单元
流控制器单元……其实就是一个特殊的内存,和运算单元类似。
比如说一个流控制器单位,当输入值>=1时则执行F1() (等价于合成F1),当输入值为0时则执行F0()(等价于合成F0)。则:
CPU网络有2输出总线为之控制:F0\F1。都有红石卡和合成卡。
两个输入端,I0和I1,当I1为1时根据对应的I0激活一个输出总线,然后将CPU重置并将自己设置为0.
先写个程序:输入n正整数个数,找出最大值
用 C.符号.slot 表示运算器地址。A为1,B为2,C为3,M为0
用 T.数字 表示寄存器地址。
St.内存
In.?.first:In.?的第一个单元(取出)
If.?.0判断
If.?.1激活
Main():
In.0.first,St.0
St.1,0
St.0,If.f1.0
1,If.f1.1
f10():
//None
f11():
//C--
St.0, C.-.1
1, C.-.2
1, C.-.0
C.-.3, St.0
//St.1=max(input, St.1)
In.0.first, C.max.1
St.1, C.max.2
1, C.max.0
St.1, C.max.3
//If
St.0, If.f1,0
1, If.f1.1
|
|