本发明涉及一种用于结构运算的运算单元。这种运算单元下面称之为磁心单元。 计算机是本世纪四十年代发明的。从那以后,计算机一直以革命性的速度发展着。但是尽管如此,今天的计算机与最初的计算机的结构差不多是相同的。
人们对计算机作的改进大多在硬件上。超大规模集成(VLSI)技术的引进以及金属版印刷术的提高使得把仅在五年前还被称作超级计算机做成单片计算机成为可能。计算机的尺寸在以指数级缩小,现在的线宽也不大于1微米。时钟频率及有源晶体管的数量增加了几个数量级。各种物理制约很可能把线宽限制在0.2微米左右。
与此同时,计算机结构在使用硅材料这点上没有得到改进。相反为了工作得更快,大多数计算机使用多于最佳量的硅材料。
上面提到的这些事实将在以后五年中制约着单片处理器的速度的提高。人们还引用了并行处理器,但产生了因复杂性增加而导致硬件成本提高以及大多数类型的程序的编程成本上升过高等问题。
如果减小硬件成本,则新系统的编程成本就会显著上升,不久就将达到极高地水平上。这两者是相互关联的。
一台计算机是由不同的软、硬件单元组成的一个复杂的集合,在其发展中的不同的过程和阶段产生了(不管是特设的还是设立的)散布在系统中的各种标准。正是由于这种不一致性,计算机中才有大量的接口。
所有这些接口以及不同数量不同类型的适配都使用户或者程序员使用机器时变得困难,因为使用这种机器需要很多知识。程序员也可能由于这种复杂性而引入隐藏错误。
但是,目前人们正在开发所谓的归约处理器(reduction processor)。归纳处理器处理的程序具有某种包含运算数表达式的结构,这种结构在多个归约步骤中得归约。这样,程序的执行不是象其他类型的计算机中的那样按一定的顺序进行的。
但是,要在一个有限的规模之上开发一个归约处理器,还有不少困难。
第一台电子计算机的开发也开始了适合于这类计算机的多个流程语言如FORTRAN.COBOL.Algol,BASIC,Pascal等的开发。这些语言被称为命令语言(以下也叫做常规语言),之所以这样叫主要是基于下面的事实,即它们通常给出的程序由一系列被常规的计算机顺序地加以执行的命令或者指令组成,这里的常规计算机是指根据约翰·凡·纽曼(John Von Neumann)建立的原则而设计成的计算机。这些语言在使用上日趋明显的不方便导致了另一组语言的开发,这组新的语言有:LISP,ISWIM,Scheme(LISP的一种“方言”)、ML、Hope、SASL等。开发这些语言的驱动力是概念简洁,没有一种具体的机器能够影响设计。功能语言过了一定时间之后才受到人们的注意,一个原因是功能语言执行起来很慢。以后的开发显示,在某些情况下功能语言的执行速度可以接近或者赶上由常规计算机执行的常规(命令)语言程序的执行速度,虽然功能语言程序并不是准备由这类计算机来执行的。
促使人们花费大量努力来开发功能性语言的是命令语言在使用中日益明显的不方便造成的。大约在1970年左右,有人开始谈论软件危机。程序变得越来越复杂,通常它包含不少错误,难读难理解,修改起来更难。原因之一是人们的这种“高级命令语言将简化编程”的期望过高,现在看来这些语言并未达到这样的高度。命令语言还是只适合于最初的计算机概念即约翰·凡·纽曼的那种计算机,其编程级别还是相当接近于机器级。而功能性缩程语言具有几个性质能够消除这些常规编程语言的一些缺点。
为了提供附加信息以便加深理解,我们推荐“使用标准ML进行功能编程(Functional Programming Using Standard ML)”一书,作者爱克·韦克斯特姆(Ake Wikstrom),Prentice Hall 1987。
为了充分理解本发明的目的和优点,重要的要了解计算中的一个功能性方案包括什么,特别是它与历史上更流行的命令性方案相比较而言时包括什么。
“功能性方案”这一名称是称用功能性语言写成的。在一台包含有特别适合于这些语言的硬件计算机上存贮、执行的程序,而“命令性方案”这一名称是指用命令语言写成的、在一台包含有适合于命令语言的硬件的计算机上存贮、执行的程序。
但是,在一台经典计算机上存贮并执行用功能性语言写成的程序是可能的,反过来也是可能的,即用命令语言写成的程序也可以在一台适合于执行用功能性语言写成的程序的计算机上执行。
一个用功能语言写成的程序可以看成是目标性质的定义和计算规则的集合。上述的定义是说明部分,计算(或者叫归纳、改写)规则是计算机在执行期间使用的操作部分。功能语言提供了一个与计算机的更高级别的接口,使程序员能够脱离开计算机中与硬件有关的技术细节。功能性程序的一个有益的副作用是程序通常较短,也比通常的命令程序容易理解。功能语言的一个主要缺点是功能性程序要在一台经典计算机上执行的活动必须先转换成命令语言,这通常是由编译程序或者解释程序完成的。因此,很显然,功能性方案的某些优点由于下面的事实而被抑制,即现在还不存在能够有效地存贮并执行功能性程序的专门硬件。
本发明的目的在于提供一种有源存贮器中的特殊的有源存贮单元(以下称之为磁芯单元),该单元能够执行所有类型的归纳运算,上述的有源存贮器中也包含只能够执行有限的一部分归纳运算的其它类型的存贮单元。虽然数值运算可以在与磁芯单元相连的数字算术逻辑单元(数字ALU)中进行,但是实际的归纳操作可以在磁芯单元中进行。
本发明的另一个目的是提供一种能与一个包含有限的存贮单元的最好是一个相联存贮器协同工作的磁芯单元,该单元是唯一与上述的相联存贮器具有交换信息的直接通道的单元。
本发明还有一个目的在于提供一种能存贮一个表达式的多个级别的磁芯单元。存贮在磁芯单元中的表达式的基本指令可以在磁芯单元中被执行。
本发明的另一个目的在于提供一种用于结构运算(即归约计算机程序给出的结构的运算)的磁芯单元),其中单元中的表达式的规模与执行中涉及到的表示图中的分支相对应。一台经典类型的计算机可以装在一个用于结构运算的磁芯单元,在使用基于结构运算概念的那类编程语言(如LISP=List Processing Language)或者任何其他的功能性或者说明性语言时这将发挥出特别的优点。LISP语言特别适合于处理和运算清单或者由清单建立的结构,在人工智能领域内(如建立一个专家系统时)使用很普遍。在符号代数、VLSI设计、计器人、自然语言理解等方面也有使用。在这些场合下,磁芯单元可以是通过改写和/或归纳对这些清单进行处理的装置。
一个执行的程序可以表示成由几个闭包组成的方向图,程序的每一部分都可以由一个闭包(Closure)来表示。在执行过程中,这个闭包方向图根据所使用的语言的归约规则被逐渐归约。一旦没有可执行的闭包留下时,程序的执行也就结束了。闭包方向图也可以被视为一种树结构,树上的每个结点都是一个闭包,最高的结点叫做树根。归纳处理通常是通过从根而上归约树结构而执行的,即先归约树中那些离树根最远的部分,再一直径上直至树根。这种执行方式一般被称作需求驱动执行方式,意思是说如果程序中的某个部分的执行取决于其它部分的执行结果的话,那么该部分程序的执行将一直延迟到上述结果能得到时为止。
下面的表中列出了本说明书中所用到的一些术语及它们的保留意义:
元素 数据结构中较大的部分,
清单 一个有顺序的元素序列,每个元素反过来又可以是一张清单;
被插入清单 一张清单的一部分,小到足以全部存入一个闭包中能表示任意长的清单,
闭包 定义一个过程的呈分层结构的一个整体。所有的闭包都有一个能唯一定义该闭包的根。在归约机器上进行的归约工作是针对闭包进行的。机器的整个状态能被归约所转换。
目标存贮器 包含存贮着目标的存贮单元的存贮器。比方说一个相联存贮器。
存贮单元 目标存贮器中的一个单元,它存贮一个单元闭包,也可能用来指存贮在其它存贮单元中的其他单元闭包。
单元闭包 一个存贮单元中的内容
存贮单元段 存贮单元中的一个数据段
闭包元素 存贮在存贮单元段中的一个数据元素,
闭包识别符 唯一指定一个闭包的闭包单元元素,
归范闭包 一个不能被再归约的闭包,亦即不包含任何指示着其它单元闭包的闭包识别符的单元闭包,上述的其它单元闭包有可能被进一步归约。
目的 一个待执行即待归约的闭包,
父包 在数值/指示段中至少有一个闭包识别符的闭包,
子包 通过指示着它的一个闭包识别符与另一个闭包相连的闭包。
一个子包也可能又是一个父包,一个父包也可能是一个子包;一个子包可以有多个父包,一个父包可以有多个子包。
闭包位置 闭包是根还是结点,
根 一棵闭包树中处于最高位置上的闭包单元
结点 闭包树中不是树根的闭包单元,
位置 包含闭包位置的存贮器单元段
类型 单元闭包中的类型码,亦即表示目标性质的位组合格式,如指令码,单元闭包中一个元素,用来指示它是可执行的、延迟评价的还是待用,
识别符 用来代表存贮在存贮单元中的目标的特殊类别的一种闭包元素,
环境 通过给目标予相同的环境而把目标分组,
数值/指示 指存贮着简单数值(如直接表示)、空白、或者至另一个闭包的指定值(即间接表示)的闭包元素,
磁芯单元 指根据本发明的结构运算单元,该磁芯单元能执行与归纳闭包有关的结构运算,
数值ALU 指能够执行基本的数值和逻辑运算的数值运算单元,上述的磁芯单元使用该数值ALU进行数值运算,
全寄存器 伸展至一个磁芯单元中的所有平面上的寄存器,
磁芯字 磁芯单元中一个全寄存器中的内容,
有限寄存器 指磁芯单元中伸展至有限量的平面的寄存器,这些有限量的平面包括一个数值/指定类的闭包单元元素,
元素字 指一个有限寄存器或者与该有限寄存器具有相同的伸展状况的部分全寄存器的内容,
数码(num)字 指表示一个数值或者指示值的元素字的一部分,
特征字 指具有指示出上述的数码字的表示特性的特征值的元素字的一部分,
归约 指根据所用的具体编程语言的规则对一个闭包进行改写/重建。
本发明的主要目的由一个结构运算处理方法来实现。该方法包括:
a)把数据字存贮在多个寄存器中,每个数据字都有一个标志部分和一个信息部分,上述的标志部分中都有一个指示着该寄存器是否在使用中的标志。
b)上述的数据字被安置在许多清单(list)中,把每个这样的清单存贮在预定数量的寄存器中,存贮在寄存器中的上述清单中每个上述字中的标志部分在使用中用来指示:一个上述的表至少有一部分存贮在实际寄存器中、一部分存贮在上述实际寄存器中的上述清单包括一个list(列表)指令、它是一种什么种类的清单以及这些清单间的关系从这些清单在上述寄存器中的分配的哪一部分来看是清楚的,
c)控制上述的寄存器,使用属于存贮在上述寄存器中的清单中的上述列表指令在上述的寄存器中重新安排上述的清单,并根据上述的列表指令输入/输出寄存器中的内容。
本发明的用于进行结构运算处理的运算单元包括:
a)至少一个用于输入/输出数值清单的输入/输出装置,
b)多个寄存器,每个这样的寄存器都能用于存贮一个数据字,每个数据字都有一个标志部分和一个信息部分,上述的标志部分包含一个标志,该标志指示出所述及的寄存器是否在使用中,每个上述的清单均能存贮在预定数量的上述寄存器中,每个存贮在寄存器中的上述字的标志部分在使用中用来指示:一个上述的清单至少有一个部分存贮在实际寄存器中,一部分存贮在上述实际寄存器中的上述清单包括一个列表指令,该清单的种类是什么,以及清单之间的关系从这些清单在上述寄存器的分配中的哪一部分看是清楚的。
c)控制装置,用于控制上述的寄存器,并使用属于存贮在上述寄存器中的清单中的上述列表指令来在上述寄存器中重新安排这些清单,并根据上述的列表指令输入/输出寄存器的内容。
清单最好以清单树的形式存贮在上述的寄存器中,其中有一个清单作为根清单。这个被存贮了的清单树的识别符最好存贮在一个分离的识别符寄存器中。被存贮的清单树的环境被存贮在一个分离的环境寄存器中。该树的根清单最好被放置在不同的寄存器中,视被存贮的上述的实际树的级别而定。一些寄存器被安置成一个包括一行主寄存器的基寄存器矩阵。一个只包含一个级别的树被存贮在一个主寄存器中。一个包括二个提供根清单的级别的树最好存贮在上述主寄存器中,其树枝清单存贮在基寄存器中。在上述的矩阵之外还可以安置另一组附加的寄存器,称作辅助寄存器。包含三个级别的树最好存贮在上述的辅助寄存器中,把它的一个元素存贮在上述的寄存器矩阵中。
清单树的根清单可以被划分成许多元素,控制装置可以从根清单的第一个元素中推出这样的信息:即要进行什么类型的归约;其它元素表示待归约的数据。上述根清单的第一个元素中的信息可以包括一个指令码(控制装置将用这个指令码推导出要执行的是什么种类的指令),也可以表示代表函数定义的一个清单树的根,控制装置将用这个信息来推导出为归约根清单而要采取的行动。
上述树清单的第一个元素中的信息可以包括一个代表函数定义的树的根。
一个清单中的字的最大个数最好为四。上述清单树的最大深度最好为三级。如果深度为三级,并且存贮在上述寄存器中的上述根清单中的列表指令指示出:上述的根清单具有一个或多个分支,控制装置在寄存器中存贮上述分支中的一个。
结构运算是在存贮在寄存器(如基寄存器、主寄存器或者辅助寄存器)中的目标数据上提供的。
上述寄存器中的数据堆栈最好设置成一种分片方式,这样每个数据堆栈中具有相同位置的每个堆栈位元素可以在一个包含了所有属于所有的上述寄存器(这些寄存器在上述的位置上都有一个堆栈位元素的堆栈元素的平面内逐位地连接起来。一些寄存器具有比较长的堆栈这样,一些平面只具有属于这些较长寄存器的堆栈位元素。
至少一部分寄存器(即称作为基寄存器的寄存器)在一个由N×N个寄存器构成的矩阵中安置成许多行和列,这里N为一个整数这些基寄存器中的堆栈元素被逐位连接起来。对于上述基寄存器堆栈中的每一位而言,每一列被提供一根列线,每一行被提供一根行线,在每个具有相同的列和行号的上述列线和行线的交点上都提供了一个可控开关。每个基寄存器至少与最近的行线和列线具有可控的寄存器连接。沿行和沿列相邻的基寄存器之间也提供了连接。控制装置对这种可控开关和可控寄存器连接进行控制,根据待执行的指令的种类进行下列三类连接中的至少一类:
a)从一个寄存器到另一个寄存器在一个方向上的连接,
b)寄存器之间在二个不同方向上的分离的连接,
c)寄存器之间的时分连接,其中被存贮的清单元素的传输可以先在一个方向上进行,在二个后续相位之间又在另一个方向上进行。
寄存器堆栈中的每个单元最好包括:
a)一个内部的一位寄存器
b)至少一根能与上述的一位寄存器相连的一线点线,
c)至少一个可控的内部连接,每个内部连接都包括一个可由控制装置加以控制的开关,该开关使上述的至少一根一线点线中的一根能与下列元素中的一个相连:那该单元之外的点线以及属于另一个寄存器堆栈的单元中的一个。上述的至少一个内部一位寄存器可以包括一个输入缓冲装置(如一个反相器)和一个输出缓冲装置(如反相器),以及连接在上述的缓冲装置之间的可控开关。上述的输入缓冲装置和输出缓冲装置可以通过上述的可控开关分别与上述的至少一根一线点线相连。
一些寄存器单元具有固定的、与寄存器的位置有关的值,这些值被连接到不属于上述内部寄存器的连接之一的上述的至少一个内部连接上。
可以连接上一个比较器对上述部分寄存器中的内容加以比较,再把比较结果提供给称为之访问的外部总线中的一个线上。
如果结合附图来参阅下面的描述,可以更全面地理解本发明以及本发明的其它一些目的及优点。附图中,
图1.概略地示出了归纳处理器的结构,该处理器中包括了根据本发明的磁芯单元,
图2A.示出了一个能够存贮一个单元闭包的存贮器单元,
图2B-2D.示出了可以用在本发明的磁芯单元的实施例中的磁芯寄存器,
图2E.示出了磁芯单元实施例中的磁芯寄存器的一种可能的结构,
图3A至3F.示出了本发明的磁芯单元中的不同的数据存贮形式,
图4、5和6.示出了本发明的磁芯单元中的运算实施,
图7.示出了本发明的磁芯中的第一类运算平面的第一个实施例,
图8.概略地图7中的第一类工作平面的具有各类可能的连接的一个完整的寄存器单元的设计实施例,
图9A至9F.示出了寄存器单元中使用的不同种类的元件的实例,
图10和11 示出了图7中的第一类运算平面中不同的寄存器单元的设计示意图,
图12.示出了本发明的磁芯单元中的第二类运算平面(属性平面)的第一个实施例的方框图,
图13至15,概略地示出了图12中的第二类运算平面中的不同的寄存器单元的设计,
图16至17,示出了寄存器单元之间进行交换的两个例子,
图18至24,示出了多个不同的在磁芯单元之间进行数据传输的实例,
图25,示出了本发明的磁芯单元中的第一类运算平面的第二个实施例的方框图,
图26,概略地示出了运算平面中寄存器单元的第二个实施例的设计图。
在图1中,磁芯单元被表示为包含在一个单归约处理器(即可以作为一个更为复杂的归约处理器的一部分的比较简单的归约处理器)的实施例中。从图1中可以清楚地看出这种归约处理器的结构。值得注意的是它的设计可以是相当不同的,比方说磁芯单元的各个平面在芯片上可以并排设置,也可以设置与图示情况不同的并列层次。
图1中的单归约处理器包括一个具有多个磁芯寄存器3P的磁芯单元2P。和一个目标存贮装置4P。该目标存贮装置4P包括许多存贮器存贮单元,其中的每一个都存贮一个单元闭包,最好也能提供有限的归约运算集。如果图1中的单归约处理器是一个包括多个单归约处理器的更为复杂的归约处理器的一部分,那么还应包括在这多个处理器之间进行通讯的处理器网络数据交换装置5P。这个数据交换装置5P包括多个用于临时地保存单元闭包从而把单元闭包传送给另一个单处理器的寄存器。由于转换装置5P不是本发明中的实际磁芯单元的一部分,因此对它不再进行描述。
上述的处理器还包括一个用于控制磁芯单元2P中的各元素的控制单元6P和一个数值ALU 1P。控制单元6P是一个布尔门电路阵列,在磁芯单元将要处理的闭包的内容加以处理。控制单元6P和数值ALU都不是本发明的实际部分。因此对它们不再进行详细描述,只是在下面结合实施例来描述送往和来自它们的信号。对于有关控制单元的设计方向的进一步信息,我们推荐由卡佛·米特(Carver Mead)和赖恩·肯威(Lyhn Conway)所著的Addison Wesley出版公司在1980年出版的“VISI系统导论(Introductions to VLSI System)”一书。
磁心寄存器具有一种从目标存贮装置4P推导出的结构。一个目标存贮装置单元中可以只存贮一个一级结构即一个单元闭包。磁心寄存器通过一根总线与目标存贮装置相连,上述的总线宽度足以转送一个一级结构(即单元闭包)。然而,磁心单元可以含有和包括一个((最高的)三级结构。这样就有四种情况,即一个0.1.2或3级目标结构可以存贮在磁心单元中。正象下面要解释的那样,如果存贮的是一个三级目标结构,那么只是它的最高级别(树根)和一个分支被存贮,不然的话,存贮的就是所有的级别。
磁心单元作为一个整体是一个用于结构运算的运算装置,它包含几个磁心寄存器3P。这些磁心寄存器中存贮着多个清单的树结构。每个清单包括多个字。这些寄存器(有限寄存器)中的一部分能单独存贮一个元素字,一个元素字包括一个数值字和一个特征字。特征字指示出数值字的表示特性。举个例子来说,如果数值字代表的是一个值,那么,特征字就指示出该数值字中包含的值的种类(比方说它是整数还是浮点数还是其它别的数)。磁心单元一次只能处理一定长度的清单,视它们装的寄存器的多少而定。用来存贮一个清单的寄存器数量最好为4个,这意味着被存贮的表可以有4个或小于4个的元素。举个例子来说,一个寄存器可以包括一个占据32位的数值字和一个6位的特征字。在这种情况下,一个具有四个元素的清单将占据4×38位。
但是,注意长的清单也可以被处理,只是这时每个清单必须被分割成多个长度等于或小于磁心单元能处理的最大长度。磁心单元一次只能处理具有一定深度的树。具有很大深度的树也可以处理,只是一次只能在磁心单元中存贮长度有限的一部分树,也就是说,一次只能处理树的一部分。
目标存贮装置(最好是相连存贮器)4P通过一个完成信号适配的转换接口9P和一个具有闭包宽度的总线8P与磁心单元实现互连。总线8P为一条部分总线OBJV(垂直目标总线)与寄存器平面NUM相连、部分总线TAG与寄存器平面HBAD相连的总线,因此,它是一条能传送一个一级结构的总线。接口9P把通过闭包宽度的总线OBJ 8P从磁心寄存器3P送来的信号加以放大、转换成适合于目标存贮器中的存贮单元的信号。它也将在读取操作中来自目标存贮装置的信号加以放大、转换成适合于磁心单元寄存器的信号。虽然该接口在图中被表示成位于目标存贮装置4P中,它也可以与磁心单元做在一起。但是,接口9P可以不认为是本发明的磁心单元的一部分,因此这里不再加以叙述。
从图中可以清楚地看到,磁心寄存器可以分几个标为平面NUMHEAD、BOOL、TYPE、WHERE、LAZY.CLOS/SIMPLE的部分。不同的部分包含不同数量的平面。为简洁易读起见,图1中只示了少数几个平面。在下面的描述中,TYPE、WHERE、LAZY及OLOS/SIMPLE平面被称作属性平面。
数值字可以存贮在寄存器平面NUM中,而特征字则可以存贮在寄存器平面HEAD中。这里可以有(比方说)32个NUM平面的和6个HEAD平面。
在图1所示的处理器实施例中,可以有(比方说)5个TYPE寄存器平面、1个WHERE寄存器平面、2个LAZY寄存器平面和1个CLOS/SIMPLE寄存器平面。下面将对磁心寄存器的工作情况进行描述,从这些描述中可以清楚地看出将要存入上述平面的那些磁心寄存器部分中的信息。
为了介绍磁心单元的开发装置,我们想描述一下在开发本发明的磁心单元之前被开发的特殊目标存贮装置4P,该装置在第 号未决美国申请中得到了进一步的描述。另外,还可以看到:本发明的用于结构运算的运算单元边可以与更普通种类的计算和存贮装置相连。还可以注意到:本发明的磁心单元是一种只执行结构运算的装置,它使用数值运算单元(数值ALU)来执行数值运算。这就是说,给一个处理器装上一个既执行数值运算又能执行部分结构运算的算术/逻辑单元,这个先有技术中的ALU并不为结构和数值运算而划分成不同的功能部分。在使用通常的ALU时,为了执行与在磁心单元中执行的结构运算等效的操作,还需要一个小程序。
目标存贮装置4P比一般的RAM型具有更多的灵巧性。它是一种相联存贮装置,它能提供比普通的RAM型存贮器提供的“读”和“写”操作还要多的服务。
目标存贮装置被划分成许多存贮单元,每个存贮单元包括多个存贮元素。它们提供的服务级别是很高的。举个例子来说,只用一个存贮器指定,它就能在各个存贮单元中找到一个特定的数值单元的所有出现场合,不管它们在何处;同时能全局地即在整个目标存贮装置的范围内把找到的特定数据单元改写成一个新值。由于该目标存贮装置是关联的,因此,这种改写操作不管影响到多少个存贮装置单元,都可以在二个物理存贮器周期内完成。
图2A中给出了一个存贮装置单元的实施例。它能存贮二类闭包单元,包括特别适合于待存贮的各元素的多个段。在图2中,这些段被赋予了与将要存贮在其中的元素相同的名字。
第一类元素描述存贮单元的各种不同状态。一个这类的元素是LAZY,由它指明该单元是空闲(此时该单元中的其他内容将被视为无效信息)、执行(即处于可执行状态)。还是等待(即对该单元的数值必须延迟,在它被执行之前必须等待别的结果。另一个第一类元素为TYPE,它包括一个类型码(可以是Par、Seq、apply list、unify等等)。这些第一类的元素适合于存贮在平面LAZY、WHERE和TYPE中的磁心寄存器部分中。另外,这个磁心单元还装有一个称作“CLOS/SIMPLE”的附加平面,用于提示寄存器中的信号是一个闭包还是一个简单值。
第二类闭包单元描述识别符、环境或数值。它们是IDENTIRIERENVIRONMENT、VALUE/DES。这些第二类的元素适合于存贮在平面HEAD和NUM中的磁心寄存器部分中。这些元素中的每一个都包含一个元素字,该元素字反过来又被划分成一个存贮在芯心单元的NUM平面中的数值字和一个存贮在芯心单元的HEAD平面中的特征字。
第二类闭包单元具有一个指示上述的数值字的特征的特征字。这个特征字有两种类型:即用作识别符和环境的间接特征字和用作简单字等的直接特征字。间接特征字的实例有CIS,canon和open。如果特征字是CIS,则意味着数值字代表可以归约的闭包包。如果特征字为canon,则意味着数值字表示一个不能被进一步归约的闭包。如果特征字是open,则意味着数值字表示的闭包是一个插入清单。直接特征的实例有:discr,Cont,unused和nothing。如果特征字为cliscr,则意味着数值字是一个整数。如果特征字为cont,则意味着该数值字是一个浮点值。如果特征字为unusel,则意味着该数值字没有意义,如果特征字为nothing则意味着该数值字表示空值,即达成这样的一致,一个闭包如果有一个段为空值,则永远表示空值。
如果一个存贮单元的识别段中包含一个识别元素,该存贮单元中的处理状态可以转送到芯心单元。每一个存贮单元段VALUE/DES中都可以包括一个指示另一个单元闭包的识别符,从而与上述的另一个单元提供一种连接。被存贮的闭包的集合可以看成一种由识别符保持在一起的单元闭包的方向图或者叫树。
环境段中可以包括一个识别符,该识别符提示着提供该闭包的环境的闭包网络部分(即树)中的根闭包。但是,环境段也可以有其他用途。通过在所有被建立的单元闭包的环境中存贮建立程序的识别符,可以用环境来跟踪一个结构的建立程序。比方说,在具有相同名称的符号表示相同的东西的子树中,所有的闭包单元可以通过具有相同的环境而被分组。这样,仅在一个操作内就可以从树的一个闭包访问直至树根的整个结构。由于环境不影响磁心单元中执行的操作,因此它不是本发明的一部分,对它下面不再进行描述。
这样,一旦给定一个闭包的环境,就可以找出该环境中的树根闭包。一个环境的树根闭包在其存贮单元的WHERE字段中具有一个特殊标记(例如“1”)。而一个环境的结点闭包在WHERE字段中具有另一个标记(比方说“0”)。
可用于本发明的磁心单元的实施例中的寄存器示于图2B至2D中,用于本发明的实施例中的寄存器的结构被示于图2E中。
图2B中示出了一个寄存器。从该图可看出,一个寄存器由多个寄存器单元组成,每个单元可以存贮一位信息。该图的描制方式想表示:一个寄存器伸展至磁心单元中不同的平面上,每个寄存器单元位于一个平面上。
图2C示出了一个伸展至该磁心单元中所有平面上的一个寄存器(即一个全寄存器)。这类寄存器可以在位于NUM和HEAD平面中的寄存器单元中保存一个识别符或一个值,在位于BOOL、TYPE、WHBRE、LAZY和CLOS/SIMPLE平面中寄存器单元中想可以保存一个上面描述过的状态。
图2D示出了只伸展至磁心单元的NUM和HEAD平面的一个寄存器(即一个有限寄存器)。
图2E示出了磁心单元的实施例中的寄存器的一种可能的构造。磁心单元有许多最好排列成一个正方形(称之为基寄存器陈列)的多个基寄存器。这些基存贮器沿着它的一边有一个主行,称作主寄存器。在其底部都有一个主寄存器的每个基寄存器列叫做子寄存器。芯心单元也可以装有一个识别符寄存器和一个环境寄存器。在基寄存器矩阵的一边设置有一行辅助寄存器。
在磁心单元的实施例中,所有的基寄存器除了主寄存器之外都可以是图2D中所示的那种类型(即有限寄存器),图2E中的其他寄存器可以是图2C中所示的那种类型(即全寄存器)。
在详细描述磁心单元的硬件结构之前,先根据图3A至3F描述一下数据的不同存贮形式,并参考图4A至4H,5A至5G和6A至6G给出其操作实例。
如图3A所示,作为归约结果的简单值25位于主寄存器的一个特殊寄存器中。上述的结果可以是一个单元闭包的一部分。
进行归约时,装入磁心单元中的是一个目标。如图3所示,一个只包括一个一级结构(通常是一个不参考其他单元闭包的闭包)的目标存贮在主寄存器中。本实例表示了一个简单的数字运算,即把数值1,2和3相加。数值指令“+”存贮在第一主寄存器中,待处理的元素存贮在其他主寄存器中。
如图3C所示,一个包括一个二级结构的树可以使它的根清单((作为父)水平地存贮在主寄存器中,使清单(作为子)垂直地存贮在基寄存器中。在本实例中,具有清单表示((12)(34)),而结构存贮在基寄存器矩阵中。根清单(如子表中的最初元素加1,3)存贮在主寄存器中,而子清单(即(12)和(34)则垂直地垂直在子寄存器中。此外,下面将参照图4给出这类存贮装置的进一步实例。
如图3E所示,包含一个三级结构的目标树使它的树存贮在一个辅助寄存器中,使它的单一的子节点存贮在主寄存器中。在图3D中,目标树的树根(指令Transpase)存贮在一个辅助寄存器中,其子节点(即清单(id1,id2,id3)存贮在主寄存器中。清单中的每个元素反过来又可以是有“子层”的“父层”。在图3E中,这些儿子被垂直地装入基寄存器中,即id1与它表示的清单(123)相交换,id2与它表示的清单(11 12 13)相交换,id7与它表示的清单(27 22 23)相交换。
如图3F所示,一个以流水线格式存贮的树被装入。目标清单装入主寄存器中。目标之父装入辅助寄存器中,而把待处理的指令和元素在这二类寄存器中都存入。对数值表达式进行归纳时最好使用流水线模型的运算。这样做的一个优点是中间结果可以暂存在磁心单元中而不是存入目标存贮装置中。
实例1
图4A至4H示出的第一个实例是将作为可归约闭包给出的并行数值加以联合:
unify(par(1 par(1)3)par(1 par(1)2))上述的闭包是一个可归纳的闭包,其中可以进行多个并行联合。该可归纳闭包将被改写成一个并行联合结构。
图4A中示出的最初始的可归纳闭包。图4B表示该可归纳闭包是怎样存贮在目标存贮装置中的。图4A中标出了多个存贮单元中存贮了该可归纳闭包的不同部分。图4B中标出了元素闭包和单元闭包之间的连接。具有识别符id1的单元闭包在其类型段中具有类型码unify,具有识别符id2,id3和id4的单元闭包在其类型段中具有类型码par。识别符为id1的单元闭包含有指示着识别符为id2和id4的单元闭包的闭包元素前二个数值/指示。这些单元闭包的特征为canon。识别符为id2的单元闭包使它的第一和第三数值/指定闭包元素为离散值,特征字为discr,使它的第二个数值/指定闭包元素指示着其识别符为id3的单元闭包,从而特征字为canon。识别符为id3的单元闭包使它的第一数值/指定闭包元素存贮有一个整数,因此特征字为discr。识别符为id4的单元闭包使它的第一和第三数值/指示闭包元素为离散值,特征为discr;使它的第二数值/指定闭包元素指示着识别符为id3的单元闭包,因而特征为canon。
如图4C所示,单元闭包识别符为id1的存贮单元的内容首先装入磁心单元中,即在第一个操作步中把它的含有闭包的类型码unify的识别符id1放置在识别符寄存器中,把数值/指定元素作为目标设置在主寄存器中。实际操作步骤如图18所示,下面将要详细描述。
如图4D所示,识别符为id2和id4的子结构垂直地装入基寄存器中,使得它们的第一数值/识别元素放置在标有它的识别符的主寄存器中,其余的数值/识别元素或一竖列放置在上面的寄存器中。每个这种子结构的类型码par也装入主寄存器中。这个类型码被装入位于TYPE平面中的寄存器单元中。
如图4E所示,基寄存器中的内容被转置90°,使得基寄存器的第一竖列置入主寄存器中,第二竖列放置到与主寄存器平行的基寄存器的一行中。转置操作在图23中得到了描述,以后还将详细讨论存贮在识别符寄存器和主寄存器中的类型码par和unify互相转换,这是由控制单元自动完成的。现在,假设基寄存器中含有一个父层,它有三个排成一列的子层。现在,使用指令make把每个子层装回到目标存贮装置中。作为回答,目标存贮装置提供被存贮的子层的识别符,可以看出,控制电路6P属于门电路阵列,它特别地检测平面CLOS/SIMPLE至TYPE中的寄存器的内容,并根据从中发现的信息提供(比方说)用于控制开关和门电路的指令。子层在id1之后依次命名,已经使用了的名字则不再使用。但是,名字的顺序是不重要的,因此可以是随意的。
如图4F所示,第一个子层得到的识别符为id3,含有与有着现别符id3的单元闭包的第二个子层得到的识别符为id4,第三个子层得到的识别符为id5。其单元闭包与具有识别符id2,id4,id5的单元闭包相联的父层还保持它的识别符id1,然后再被存贮到目标存贮单元中。
图4G示出了存贮有可归纳闭包
par(unify(1))unify(par(1)par(1))unify(23))的存贮装置单元。该可归纳闭包本身被表示于图4H中。图4G和4H的绘制方式与图4A和4B相同,因此也是具有自解释性的。
从图4G中还可以看出,类型码为unify的单元闭包在其LAZY段中给赋予的记号为exec,而识别符为id1的单元闭包被给予的记号为wait,这意味着为了把单元闭包中的内容归纳成数值,必须在执行识别符id1指定的单元闭包之前执行标为exec的单元闭包。图4H中的闭包在以后的时间点上可以装回磁心单元中进行进一步处理。举个例子来说,由于数值1与其数值/指定元素中的1是相同的,具有识别符id2的单元闭包的值将为1;由于其数值/指定元素中的值2和3不相同,因此识别符为id5的单元闭包将产生空值,每个联合都将在数值ALU中进行,由它把比较器中的值进行比较,并把比较结果送至控制单元6P。该控制单元又设定它的布尔门电路阵列,从而相应地在磁心单元的第一主寄存器中提供信息。当一次归纳产生一个规范指定或者简单值或者空值时,它将全局地分散到目标存贮装置的所有的存贮单元段中,目标存贮装置可以这样存贮第二类的单元闭包,就是使至被归纳的闭包的每个间接指定转换成对数值的直接指定。这是由下面将要结合附图21加以叙述的unify-id操作来实现的。
实例2
本实例是一条硬件指令list expansion,意思是单元闭包包括一个插入清单。这种指令其他归纳中为辅助步。硬件指令list expansion在图24中也得到了描述,以后还将参照图224进行叙述。
机器进行一条叫做ex.type的范例指令的归纳,它可以是任何类型的包括数值和清单、具有下列形式的指令:
ex·type(1 list(2 3 list(4 5 6)) 7)
这种形式被表示在图5A中,它的单元闭包被表示在图5B中。图5A和5B的绘制方式与图4A和4B相同,因而它们是具有自解释性的。
如图5C所示,识别符为id1的单元闭包被装入磁心单元的主寄存器中,它的识别符和类型码存入识别符寄存器中。由于第二主寄存器中的内容被标为间接元素open,与它相联的单元闭包作为子层垂直地装入基寄存器中,从图5D中可以清楚地看到这一点。
硬件指令list expand在图24中还将更详细加以描述,它把第三主寄存器中的离散值7移动到第三基寄存器列中的id4旁边的位置上,把上述的第二主寄存器之上的第二列中的清单部分移动至第三列,把其最低元素(数值3)送入第三主寄存器中,并赋予类型码list。由于第二主寄存器中的内容为分离值,因此,它具有特征字为discr。
接下来,进行一次新的清单扩展,把上述的主寄存器上的第三列中的内容放入第四列中,并使其类型码为list。另外,从图中可以清楚地看出,第三主寄存器中的内容为一离散值,其特征字为discr。
此后,在把归纳结果装回目标存贮装置之前还进行一些其它类型的ex·type归纳。
实例3
下面要执行的是数值指令。一条数值指令可以是+、-、*、/mod等等。紧跟在该指令之后的是自变量。在本例要做的是一个表中的数据之间的相加。机器对具有下列函数的一个
(application)进行一次归纳:
apply(+list(1 2))
该 被示于图6A中,其单元闭包被示于图6B中。图6A和6B的绘制方式与图4A和4B相同,具有自解释性。
如图6C所示,具有识别符id1的单元闭包被装入磁心单元主寄存器中,其识别符和类型码存入识别符寄存器中。数值指令(+)被标为一个指令。由于第二主寄存器中的内容被标为直接元素open,与它相联的单元闭包称为子层垂直地装入基寄存器中,这一点从图6D中可以看得很清楚。
接下来执行一次清单展开运算,使第二主寄存器中的离散值的特征为discr,并在类型码段中把经清单展开的数值2标为list。之所以这样是因为无论识别符为id2的清单有2个、3个还是4个元素,机器进行的运算是相同的。从图6F中可以清楚地看出,由于新表中只有一个元素,因此机器把标志list用表示主寄存器含有一个数值的标志即discr来代替。
这样,主存贮器包括一个指令标记(+)和二个离散数值,这将(比方说)通过存贮在目标存贮装置(存贮有指令)中的与指令有关的信息,控制数值ALU执行指令,并把数值运算的结果作为一个规范值送至第一主存贮器(如图6G所示)。应该注意的是类型码段中的符号apply是一个表示要进行的是逐数应用的标志。结果数值((本例中为简单数值3)被全局地分配,从而与每一个识别符id1相交换。
平面NUM和HEAD的磁心寄存器单元与平面2P的接口9P间的总线OBJv、id总线(即识别符总线)和env总线(即环境总线中的线相连。OBJv总线包括V0、V1、V2和V3等多个总线部分。
下面讲述其余的平面的用途及连接情况。
磁心寄存器单元阵列和寄存器垂直地被“分片”成多个平面,属于相同的NUM和HBAD平面但是不同的寄存器的寄存器单元再被以图7中所示的方式互相连接起来。
在如图7中所示的至少NUM一和HEAD一平面的结构中,有一个寄存器单元方阵被放置在一个具有S0,0至SN-1,SN-1N×N个寄存器的矩阵中。该矩阵中的寄存器单元叫做基寄存器,寄存器单元叫做基寄存器单元。
这些基寄存器在大多数应用场合下用于暂时地存贮闭包单元。寄存器的符号也严格地根据情况分类,比方说,指寄存器的实际位置时使用象基、主和辅助寄存器一类的符号;指寄存器的功能时,使用象子层、目标和父层寄存器一类的符号。
在本实施例中N=4,这是最希望的,当然也可以选择其他矩阵尺寸(图中未示出)。最低一行的基寄存器单元S0,0,S1,0,S2,0和S3,0如图3所示的那样和总线ho中该平面专用的线相连,因而是主寄存器。这些主寄存器单元S0,0、S1,0、S2,0和S3,0经常用作目标根寄存器,它们通过一根由导线NU0至NU3组成的总线NU至数值ALU 1P相连。
这里应该注意的是,根据本发明的示教,也可以构成不提供数值运算需求的简单处理器。在与此类似的情况下,也可以省掉数值ALU(见图1)。
识别符寄存器单元ID与连线id相连,环境寄存器单元ENV与连成env相连。
总线连接hi与点线连线vi通过一个开关SWvi相连,这里的i为0至3中的一个数。包含总线连线h0,h1,h2,h3的总线叫做OBJh,即水平目标总线。该总线OBJh用来和其它部件一起在磁心单元中垂直地装入一列寄存器中的数据,这些数据是由目标存贮装置通过总线OBJv提供的。这将在以后参考图20作进一步的描述。
总线连成id,env,V0,V1,V2和V3分别通过开关SWid,h0,SWonv,h0、SWv0、SWv1,h0、SWv2,h0,以及开关SWV3,h0与总线连线h0相连。包括总线连线Cid。Cf、Ch和Cv的总线res与控制单元6P相连,可以用来给寄存器设置常数(如零)。总线连线Cid与识别符寄存器单元相连,而总线连成Cf则与寄存器单元F0,F1,F2和F3相连,总线连线Ch通过开关SWch,h0可与总线连线h0相连,总线连线Cv通过开关SWvi,cv可与总线连成xxi相连,这是i为0至3间的数字。在某些应用场合R(图中未示出),总线res及它的开关可以省略。
在数据树中有一个顶端层,称作父层。这个父层有时候存贮在位于图7左边的辅助寄存器单元F0,F1,F2和F4中。在图示的实施例中,每个辅助寄存器中都能存贮一个磁心字。每个辅助寄存器单元可以分别与总线连线id和与该总线连线id垂直布线的总线OBJh中的连成h0、h1、h2和h3中的一根相连。辅助寄存器单元R在磁心单元能提供的少数运算中才会用到。因此在某些使用根据本发明的磁心单元的使用场合(图中未示出)下,辅助寄存器可以省略。反过来也有可能提供一个具有多于一列辅助寄存器的磁心单元(图中未示出)。
从上面可以清楚地看出,每个寄存器是由多个位于几个平面2P上且在平面上具有相同位置的寄存器单元构成。因此,即使图7中只示出了每个寄存器的一个单元(即一位),整个寄存器也是用图7中所使用的参考符号来标识。从图7中可以清楚地看出,寄存器成行成列配置。辅助寄存器区F0、F1、F2和F3在一列中,N个基寄存器区S0,0,至S0,3,S1,0至S1,3,S2,0至S2,3,S3,0至S3,3都分别在一列中,能够存贮一个子层。
每个平面中相邻的基寄存器单元之间在水平和垂直方向上都提供了连接。对于水平行上面向目标存贮装置每个最外边的基寄存器,也提供了具有固定的编程值(本实施例中为“假”f)的一种连接。基寄存器之间在对角线方向上也可以设置连接从而使可转送信息的位置之间连接起来。这意思是说,一个单元Sij(i不同于j)可以和单元Sji连接起来。每个基寄存器与位于右下方最接近的基寄存器相连,只要在那个位置上有基寄存器。每个辅助、识别符、环境和基寄存器单元都分别通过输出端ACCpx、ACCid、ACCeny和ACCsx,y与平面BOOL中的一个相连,这里的x和y是0至3之间的数。
下面讲述位于平面NUM和HEAD中的一个一般寄存器单元(图8)。图9A至9F中示出了该一般寄存器单元中所使用的开关的门电路的实施例。从这个一般寄存器单元可以得出辅助寄存器单元(图10)和识别符寄存器单元(图11)的实施例。
再下面将讲述位于ATTRIBUTE(属性)平面中的寄存器单元的实施例。图13中示出了识别符寄存器单元,图14中示出了辅助寄存器单元,图15中示出了主寄存器单元。
参考图8,一个寄存器单元的最佳实施例包括二根内部总线aR和bR,以及一个中央内部寄存器rR。总线aR和bR与该寄存器单元之外的多根连接线相连。图8中的实施例示出了一种装有各种与外界的可能的连接的一般寄存器单元。在典型情况下,一个具体的寄存器单元并不装有图8中所示的所有连接线,而是根据该寄存器单元的位置缺少一根或多根。从图7中的布线情况可以清楚地看出被连接端口间的所有布线。从图7中也可以看出,并不是所有的寄存器单元都具有图8所示的所有外连接线。因此,这里不准备给出所有寄存器单元以及它们的连接情况的详细描述。
总线aR通过开关SWvi和端口V与垂直总线连线VX相连,这里X为0至3间的一个数。另外,它还通过开关SWHi和端口H与水平总线hy相连(y为0至3间的一个数),通过与相邻的寄存器单元中的开关SWE(东)相连的一个端口W(西)与左边的寄存器单元相连;如果该寄存器单元是主寄存器单元的话,它还直接通过端口NU与数值运算单元1P相连。总线aR还通过接至右下方的寄存器单元中的开关SWD6的端口Da与该寄存器单元相连,通过接至它下方的寄存器单元中的开关SWN(北)的一个端口S(南)与该寄存器单元相连。寄存器单元可以通过与点线aR相连的端DC和开关SWC进行置位和复位。总线aR可以通过一个开关SWa1与中央内容寄存器rR的输入端相连,也可以通过开关SWa0与它的输出端相连。
总线bR通过开关SWE和端口E与右边的寄存器单元相连,通过开关SWD6和端口D6也可对角的寄存器单元相连,通过开关SWN和端口N与上面的寄存器单元相连。总线bR还通过开关SWb1与中央内部寄存器rR的输入端相连,通过开关SWb0与其输出端相连。
中央内部寄存器rR包括二个转换器Q1和Q2(最好是CMCMOS转换器),和它们之间的一个可控开关SW2。一个完整的寄存器单元还包括总线aR和bR、开关SWa1,SWa0,SWb1,SWb0和使该单元与外界相连的开关。该中央内部寄存器rR的输出分别通过开关SWH0、端口H以及开关SWVO、端口V与水平和垂直总线相连。中央内部寄存器rR存贮一种动态状态(下面将进行描述)。
磁心中所有寄存器单元中的所有可控开关都可以通过与控制单元6P相连的连线加以控制。控制电路6P包括一个门电路阵列,比方说,一个PAL(Programmable Array Logic可编程阵列逻辑)。该门电路阵列使用存贮在磁心单元中的信息来确定开关哪个开关,以及关闭哪个开关。门电路的工作由一个时钟信号加以同步。这些开关都是双向的,但是也有一些(如输入和输出开关SWHi和SWHo)只用于单向。
比较器装置COMP包括一个第一与非门G1。一个输入端与反相器Q1的非反相输入端相连,与一个与反相器22的输入端相连。该装置COMP还包括一个第二与非门G2,它的一个输入端与反相器Q1的输出端相连,另一个输入端与反相器Q2的输出端相连。这二个门G1和G2的输出与前往一个BOOL平面的单线总线ACC相连。这个与非门可以如图9D中所示的那样由两个串联连接的MOS场效应管构成;这两个串联连接的MOS场效应管的串接的源/编通道连接在地和BOOL平面之间,它们的栅极与非门输入端,上面的那个MOS场效应管的漏极即为输出端。在关联检索期间,即在应该把磁心单元中的一个元素与目标存贮装置中的或者该磁心单元的其它部分中的一个元素相比较期间,就要用到该比较器装置CONP。被比较的元素加到含有要比较的元素的寄存器单元的输入端上,这在以后还要详述。
反相器Q1和Q2可以由两个增强型MOS场效应管组成,也可以由如图9B那样连接的一个增强型一个耗尽型二个MOS场效应管组成,也可以由二个相补的MOS场效应管(如图9)组成。寄存器单元中的可控开关既可以由一个MOS场效应管,也可以由如图9F那样连接的二个相补的(增强型)MOS场效应管组成。控制单元6P通过一个控制信号C控制这些开关。从图9F中可以看出,为了实现更快的状态转换,开关可以既用控制信号又用它的相补信号来加以控制。
我们可以把图8中的一般寄存器单元视为磁心单元中所有寄存器单元的基础,即它们是用相似的方式来设计的。从上述的一般寄存器单元推出的寄存器单元只是在端口和附带的输出输入开关的数量上有所区别。这种推导出的单元被赋予与图8中所示的单元相同的参考数字。
基寄存器单元S0,0,S0,1,S2,3和S3,3没有装上开关SWD6和端口D6,基寄存器单元S0,0,S1,0,S3,2和S3,3不具备Da端口,主寄存器单元(S0,0至S2,0)不具有S端口,而其他的基寄存器单元(S0,1至S3,3)不具备NU端口。所有的基存贮器单元都不具备C端口和SWC开关,而是使用水平和垂直总线以及端口V和H用总线连线Cv和Ch提供的常数值使一个寄存器单元置位或复位。
如图10中所示的辅助寄存器单元只具有端口Hy,V,C和ACC,这里y是0至3之间的一个数,V端口与总线连线ID相连,C端口与总线连线Cf相连。
图11中所示的识别符寄存器单元只有端口V,C和ACC,这里V端口与总线连线ID相连,C端口与总线连线Cid相连。环境寄存器单元(图中未示出)与图11中的识别符寄存器单元相近似,虽然在本实施例中它没有C端口和SWe开关。在另一个实施例中,环境寄存器单元就可以包括C端口和SWc开关。
在进行关联检索期间,对前往BOOL平面的与访问相连的总线将进行比较。二个与门G1和G2把关键值即Q1的输入端上的被比较值和Q2的输入端上的存贮值进行比较。在比较期间,该关键值通过内部总线aR或bR转换至Q1。开关SW2必须为关(即开路)如果提供的值(关键值)与存贮值不匹配,那么被充电的BOOL平面将通过与非门G1和G2放电。如果匹配,BOOL平面还保持充电状态。
寄存器中所有的总线连线(每个寄存器单元都有一根总线连线ACC)都可以平行连接,并连接至BOOL平面中相同的总线连线上。另外,NUW和HEAD平面中所有寄存器单元中的总线连线ACC可以与指定给这些平面的BOOL平面中的一根总线连线相连,ATTRIBUTE平面中提供的所有寄存器单元可以和同一BOOL平面或者指定给该ATTRIBUTE平面的第二个BOOL平面中的一根分离的总线连线相连。至于提供了一个还是二个BOOL平面,以及一根还是二根总线连线,那是随选择而定的,取决于存贮在控制单元6P中的控制指令的类型。具有多于二个BOOL平面也属于本发明的范畴。提供的BOOL平面的数量反映了关联检索的细微度,即能进行的不同的关联检索的数量以及能执行的程度(即涉及哪些寄存器部分)。这样,与BOOL平面中同一根总线连线的寄存器部分可以同时进行比较。如果所有的与非门G1和G2具有相同的输出(高)那么比较将产生“匹配”,否则将产生“不匹配”。“匹配”是指两个信息完全相同。因此,BOOL平面是总线连线的平面,可以被视为虚拟或者叫“想象”平面,也就是说,点线连线不一定非得设置在一个平面中,而是可以直接和控制单元6P相连。
ATTRIBUTE平面具有与平面NUM和HEAD不同的结构,这种结构示于图12中。和图7中的元素具有相同结构的元素仍使用相同的参考符号。这类平面包括:开关SWv0、SWv1、SWv2和SWv3,一个识别符寄存器单元IDT,四个辅助寄存器单元F0T,F1T,F2T,F3T以及只包括主寄存器单元S0,0S1,0、S2,0和S3,0的基寄存器单元。此时,基寄存器矩阵被减少成一列分别与总线连线V0、V1、V2和V3以及(通过开关SWv0、SWv1,h0、SWv2,h0、SWv3,h0与总线连线h0相连的象图7中所示的寄存器平面那样的主寄存器单元S0,0至S3,0。总线连线hi通过开关SWvi可与总线连线vi相连,这里i为0至3间的一个数。另外,总线连线V0,V1,V2和V3除了引向NUM和HEAD平面中具有相同标号的总线连线之外,还可以引向接口9P的其它输入端,因而可以连接到目标存贮装置4P的其他部分(最好是LAZY,WHERE和TYPE部分)。另外,总线连线V0、V1、V2和V3还可以根本不需要和目标存贮装置4P相连,而使用总线来从目标存贮装置(即LAZY,WHERE和TYPE段)中向磁心单元中相应平面内的总线连线id转送状态信息(见图1)。另外,主寄存器单元列S0,0至S3,0,识别符寄存器单元IDT以及辅助寄存器单元F0T至F3T都与点线ves相连,该点线res与图7中所示的寄存器平面一样包含总线连线Cid,Cf,Ch和Cv。
垂直列的识别符寄存器单元IDT和四个辅助寄存器单元P3TP2T,F1T和F0T另外还与总线连线id相连,还与前往控制单元6P的第二点线连线cont(图1中未示出)相连。控制单元使用可以转送到该点线上的信息来确定应该进行哪类归纳。
图12中所示的那类寄存器平面中的每个寄存器单元还有它的访问线与点线ACC以及一根输出线SDi(这里i为0至3的一个数,或者F0至F3的一个符号ID),用来直接观察与该输出线相连的所有寄存器单元的状态。
图13中示出了位于ATTRIBUTE平面中的识别符寄存器单元IDT的实施例。它有四个端口V,CONT,SP和ACC。端口V和CONT分别可以和总线id和cont相连。端口CONT通过开关SWCONT与内部寄存器VR的输出端相连。端口SD与内部寄存器rR的输出端(即反相器Q2的反相端)相连。端口C与总线连线Cid相连。
图14中示出了位于ATTRIBUTE平面中的一个辅助寄存器单元FYT的实例,这里Y为0至3间的一个数。与识别符寄存器单元IDT相比较这种寄存器单元有一个附加端口,即端口H。端口H能与总线连线hy相连,这里的y为0至3间的一个数。其余端口的连接方式与识别符寄存器单元IDT中的相应端口类似。端口C与总线连线Cf相连。
图15中示出了位于ATTRIBUTE平面中的一个主寄存器单元SX,0的实施例,其中x为0至3间的一个数。它有六个端口V,E,H,W,SD和ACC。端口SD与内部寄存器rR的输出端(即反相器Q2的输出端相连。其余端口的连接与NUM和HEAD平面中的寄存器单元的相应单口的连接情况类似。这些主寄存器单元不具有C端口和SWc开关,相反它们是用端口V和H用点线连线CCv或Ch提供的恒定值使寄存器单元置位和复位的。
备份存贮装置模式环由该单元中的一个或二个环组成。其中一个环由开关SW60、总线bR。开关Wb1、反相器Q1、开关SWSW2及反相器Q2组成。另一个环由开关SWa0、点线aR、开关SWa1、反相器Q1、开关SWQ和反相器Q2组成。当一个或二个环中的开关被闭合时,信号可以通过二个反相器Q1和Q2前进信号电平在反相器Q1的输入端和反相器Q2的输出端处将变得稳定,数据就是这样存入单元中的,该单元中存贮的是一种动态状态。
在输出模式下,Q2的输出可以传送到总线aR或bR中的一个上,再从那通过控制适当的开关传送到一个或多个输出端口(N,S,E,W等)的输出端子上。另一根总线bR或者aR可以用于任意模式。如果开关SWa为关(即开路),则反相器Q2的输出是稳定的,亦即在开关SWa闭合之前,它不会改变。反相器的输入可以在开关SWb0闭合时转送至总线bR,在开关SWa0闭合时转送至总线aR,在开关SWcont闭合时转送至输出端cont,并且直接转换至SD端口。通过控制连结在寄存器单元和外部总线之间的开关,还可以把总线bR和aR上的信息转送到与该寄存器相连的外部总线上,这样在下面通过实例加以进一步说明。
在输入模式期间,开关SWa1或者SWb1中有一个为开(亦即闭合)。这样,各端口(N,S,EW等)中有一个的状态可以转送至本地点线aR或bR,再从那转送至中央内部寄存器rR。
通过至磁心单元中另一个寄存器单元的端口连接线可以在二个相位周期内把任何寄存器单元中的数据转送至另一个寄存器单元。在三个位相同周期内可以实现垂直、水平或对角线方向上的寄存器单元之的数据交换。
开关SWa直接由一个主时钟同步,该主时钟同时也给寄存器中的所有单元提供同步,这样可使反相器Q1和Q2之间的转送在整个磁心单元中同时完成。其余的开关由从主时钟得出的但提供与主时钟周期具有不同的适当相位间隔的信号来控制。对于磁心单元中的所有操作,主时钟都用作为一种参考信号。
时钟周期可以被划分为时钟相位O、a和b。在中央内部寄存器rR处于各份存贮装置模式时即数据稳定时,相位O是第一个可伸展相位。从点线aR进行传输时使用相位a,从总线bR进行传输时使用相位点。
单向转送(即只以或者只向寄存器单元)在二个相位的时钟周期内进行。第一相位O是稳定的。相位a或相位上用于在二个相位的时钟周期内进行传送。
双向转送(即二个寄存器单元之间进行转送而交换它们各自的内容)在三个相位时钟周期内进行。相位O是稳定的。在相位a和b期间,在不同的方向上执行传输。
应该注意的是,具有多个三个相位的时钟周期(比方说二个b相位)也属于本发明的范围。
开关SWa1和SWb1通常是闭合的。总线aR和bR都保持着寄存器单元的存贮状态。当使用一根内部总线aR或者bR来输入要存贮的新值时,相应的开关SWa1或SWb1被控制成开路。在一个长到足以使该总线上的信息转送至该内部总线的短时间间隔内,连至外部总线(如垂直或水平点线)的一个开关闭合。
还可以使用移位网络即包含与各端口相连的开关的各个不同的寄存器单元间的网络来把寄存器单元中的内容向北N、或向西W、或向或向东E转送。
图16A中示出了二个相邻的基寄存器单元,数据将从左边的那个发送元传送至右边的那个接收元中。来自控制单元6P的控制信号控制着这些开关。图16B中表示的是被上述的转送影响了的每个开关在不同阶段的状态,图中低值表示一个打开的开关,而高值表示一个闭合的开关。实际的转送在b位相中进行。转换以下列的方式进行(下面的各不同步骤被标上与图16A和16B中相同的数字):
0.电路处于稳定状态,SW2、SWa0、SWa1、SWb0SWb1闭合,发送元和接收元中的所有其它开关都打开(由于它涉及至所有的开关,因此在图16A中未标出)。这种稳定状态对应于图16B中的相位O。
1.在时钟间隔的第一个相位(相位b)期间,发射元和接收元中开关SWa均打开,
2.发射元和接收元中的开关SWa0打开,开关SWb0闭合,
3.闭合发射元和接收元之间的开关SWE,
4.打开发射元和接收元中的开关SWb1,
5.打开发射元中的开关SWa1,闭合接收元中的开关SWa1这将使数据从发射元内部寄存器前进至接收元内部寄存器,
6.在时钟间隔的第二个相位(相位O)期间,闭合接收元和发射元中的开关SWa,
7.打开发射元和接收元之间的开关SWE,
8.先闭合开关SWb0和SWa0,再闭合接收元和发射元中的开关SWb1和SWa1。这将把我们带回到上述的步骤0(即相位O)中描述的稳定状态。
图17A中示出了两个相邻的寄存器单元,这二个不同的基寄存器单元中的数据通过一次双向传送操作进行互换。来自控制单元6P的控制信号控制着这些开关。图17B中示出了被发送元影响的每个开关在各个不同相位时的状态,其中较低值表示开路开关,较高值表示一个闭合开关。这二个寄存器单元都是既作为发送元又作为接收元,因此,下面把它们称为“单元1”和“单元2”。从单元2到单元1的转送在相位a中进行,另一方向从单元1至单元2的发送则在相位b中进行。下面的不同步骤被标上了与图17A和17B中相同的数字。这种转送以下列方式进行:
0.电路处于稳定状态,SWa、SWa0、SWa1、SWb0、SWb1闭合,二个单元中其它所有开关打开(这一步由于涉及所有的开关,因而在图17A中未标出)。这种稳定状态与图17B中的位相O相对应。
1.在时钟间隔的第一相位(相位a)期间,打开单元1和2中的开关SWa。
2.闭合单元1和2中的开关SWa0,打开单元1和2中的开关SWb0,
3.闭合二个单元之间的开关SWE,
4.打开单元1和2中的开关SWa1,
5.闭合单元1中的开关SWb1,打开单元2中的开关SWb1这就能使数据从单元2前进到单元1中。
在时钟间隔的第二个相位(相位b)期间开关SWa仍然打开时,
6.打开单元1和2的开关SWa0,关闭单元1和2中的开关SWb0,
7.打开单元1和2中的开关SWb1,
8.打开单元1中的开关SWa1,闭合单元2中的开关SWa1,这将使数据以单元1前进到单元2中。
9.在时间间隔的第三相位(相位O)期间,闭合单元1和2中的开关SWa,
10.打开单元之间的开关SWE,
11.先闭合开关SWb0和SWa0,再闭合二个单元中的开关SWb1和SWa1,这将把我们带回到上面在步骤O中描述过的那种稳定状态(即相位O)。
在相位O期间,这些信号的缺省值为“通”,即门电路闭合。所有的本地点线都保持着存贮状态。通过把开关SW2和开关xo的控制信号设置成断(即开始),就可以控制用于输入的点线,这里的x为a或b。在输入操作期间,有多根点线在一个短周期内由一些端口(E、V、D、H等)短路。过一会,这些点线就会得到正确的值。
从开关SWa的控制信号的下降部分至开关SWX0的控制信号的下降部分有一个延迟。这里x为a或b。如果它很短,则不产生任何问题。但是如果该时间达到MS级,则总线XR(X为a或b)有可能失去它的动态状态。
从开关SWX0的控制信号的上升部分至开关SWX1(x为a和b)的控制信号的上升部分有一个延迟时间。如果变成负值,则一个错误值可能前进到从反相器Q2至反相器Q1的本地点线XR上。因此需要一个正的延迟时间。
这些开关一般是不通(即开路)的。此时所有的本地总线均被绝缘。通过把送至与一条总线相连的端口开关的控制信号置为“通”(就是使该开关闭合),就可以控制用于输入或输出的那条总线。在这个操作期间,可以用一些开关(SWE,SWV,SWD和SWH等)使多根总线短路一小段时间。过一会以后,总线就能得到正确的值。
从开关SWa的控制信号的下降部分至开关SW2(2可以是HD、N、V、E等等,即任何与装有开关的内部总线aR和bR相连的端口)的控制信号的上升部分之间有一个延迟时间。如果它是负值,则本地总线XR(X为a或b)的值可能变换。那时可以设置寄存器值。因此这个延迟时间应该是正值。
从开关SWz(z为H、D、N、V、E等等,即任何与装有开关的内部总线aR和bR相连的端口)的控制信号的上升部分与开关SWX1的控制信号的上升部分之间有一个延迟时间。如果它是负值,则数值不能前进到输入端。因此,应该用一个正的延迟时间。
从开关SWX1的控制信号的上升部分至开关SW2的控制信号的下降部分之间有一个延迟时间。如果它为负值,则本地总线将会被改变,寄存器可能被设置成一个错误值。因此,需要一个正的延迟时间。
在相位O期间,这些信号的缺省值为“通”。但是从开关SWa的控制信号的上升部分到开关SWa1和SWb1的控制信号的上升部分之间必须稍稍有些延迟时间。
如果上述的延迟时间为负值,那么反相器Q2的输入端上的值就不能前进到总线XR(X为a或b)。因此,必须使用一个正的延迟。
典型的列表指令在一个机器周期内执行。正如前面提到过的那样,磁心单元执行的是结构运算,由磁心寄存器使用它包含的清单中的指令来执行所有的步骤。下面示出了这些指令的例子:
length 计算目标的长度
map 用于清单中的元素的一个功能,如清单中包含插入表
则该指令也适用于这些插入清单中的元素。(指令m
map将在下面加以详述。
filter 用于过滤一个清单中的单元的功能。这种过滤也适
用于插入表(如果有的话)。
join 所有的元素被重写回插入表元素。本指令也适用于
插入表(如果有的话)。
transpose 使一个小矩阵变位。如果它包含清单元素,则
这些元素被互相换位。也处理插入表。(指令
transpose将在下面加以详述)。
磁心单元
*在几个寄存器(最好是基寄存器中)存贮要归纳的目标。
*在某些情况下(如要归纳一个三级结构时),在最好是辅助寄存器中存贮目标的根,而在基寄存器矩阵中存贮其余的结构。
磁心单元中的暂时存贮有四种情况,即存贮0,1,2和3级目标时的情况。
一个简单树即一个简单值(0级目标)被存贮在第一主寄存器中。
只包括一个级别的树存贮在主存贮器中。
包括二个级别的树可以把它的根清单作为父层水平地存贮在主寄存器中,而把清单作为子层垂直地存贮在基寄存器中。另一种方法是根可以存贮在辅助寄存器中,把子层中的一个存贮在主寄存器中。应该注意到的是,控制单元6P能根据要执行的实际操作而选择这二种方法中的一个。
包括三个级别的树把根清单存贮在一个辅助寄存器中,把它的二个级别的子层中的一个存贮在基寄存器矩阵中。
这样,一个目标树的根清单最好能根据树结构的级别以及要执行的运算存贮在磁心单元中不同地方的寄存器中。
目标树的根是一个可归纳(如unify)类型的闭包。在函数应用中,第一个元素为一个指令或者间接地指定一个用作为函数定义的闭包结构的识别符,其余的元素则是该函数/函数定义的变元。
存入磁心寄存器中的信息由目标存贮装置4P中的信息得出。磁心寄存器单元中的信息以下面的方式存贮:
ATTRIBUTE平面中的磁心寄存器与目标存贮器总线OBJ相连。所存贮的状态由识别符寄存器IDT、辅助寄存器FOT至F3T以及基寄存器S0,0至S3,0的存贮状态组成。
送至ATTRIBUTE平面中的磁心寄存器单元的控制字包括送至开关SWvi、SWvi,cv(i为0至3的一个数)。SWid,hoSWch,ho,SWV1,ho,SWV2,ho以及SWV3,ho识别符寄存器IDT、辅助寄存器F0T至F3T的主寄存器S0,0至S3,0的多个较小的控制字。
控制字通过与控制单元6P相连的多根控制线转送。这些控制线可以是双相控制对线,也可以是单相控制单线,取决于使用了什么类别的开关(见图9E和9F)。
送至主寄存器S0,0至S3,0的每个的控制字通过一个公共部分和各基寄存器特有的部分来传送。上述的公共部分控制着该磁心单元中的开关SWa0,SWb0和SWa(见图15)。另外,必须注意的是这里所描述的只能被视为一个例子,从中可以观察到几个其他类型的实施例。
平面HEAD和NUM中的磁心寄存器与目标存贮装置总线OBJ、存取点线ACC、res点线和数值ALU点线NU相连,被存贮的状态由二个单寄存器ID和ENV、辅助寄存器F0至F3以及基寄存器S0,0至S3,3的存贮状态组成。
送至磁心寄存器的控制字由送至开关SWvi,SWvi,cv(i为0至3间的一个数)、SWid,ho、SWch,ho、SWehv,ho、SWV1,ho、SWV2,ho和SWV3,ho、SWvio、SWV1、SWV2、SWV3、单寄存器ID和ENV。辅助寄存器F0至F3和基寄存器S0,0至S3,3的控制字组成。
这些控制字通过与控制单元6P相连的多根控制线被传送。这些控制线可以是双向控制对线或者是单相控制单线,取决于使用了哪一种类的开关(见图9E至9F)。
送至两个寄存器单元的控制字包括一个公共部分和一个每个基寄存器特有的部分。公共部分控制着磁心单元中的开关SWao、SWbo和SWa(见图8)。但应该注意的是这里描述的仅仅只能看作是一个例子,从中可以推导出几个实施例。
图18至24是从图7中得出的,图7中的标记也适用于图18至24。但是,为清楚起见,我们省略了大部分标号。另外,在图18至24的描述中,各寄存器单元的标号旨在表示穿过平面2P的整个寄存器。
1.对目标存贮装置4P的访问
mpx-my指令:
通过目标存贮操作mpx-mv,我们读取目标存贮装置4P,并且设置主寄存器。被访问的目标正象图18中带有指进行传送的寄存器单元的粗实线所示的那样,通过总线V0、V1、V2和V3送给主寄存器S0,0,S1,0,S2,0,S3,0,通过总线id送至识别符寄存器ID,并且通过总线env送至寄存器ENY与此同时,主寄存器中的原有内容作为一个闭包存贮在目标存贮装置4P中。这样,mpx-my指令把当前的磁心单元闭包存贮在目标存贮装置中,并把下一个要执行的目标存贮装置闭包装入磁心单元中。
图19和图20表示了这样一种情况,即在一个主存贮器中存贮了一个识别符,该识别符要和它指定的信息而交换。把这个如图19中存贮在S2,0中的识别符送给目标存贮装置4P,目标存贮装置找出该识别符及其它表示的内容,把该内容放到总线连线V0。至V3上,最后装入一垂直基基寄存器(如图20中的S2,0至S2,3)中。
上述操作是由通过总线ho及开关idid,ho(图19)把基寄存器S2,0中的识别符发送至垂直点线id上开始的。存贮值可以以相似的方法从任何其它寄存器发送。
操作继续时,把目标存贮装置4P在点线连线V0、V1、V2和V3上提供的值装入适当的寄存器中,在本例中这些寄存器为S2,0、S2,1、S2、2、S2,3,并通过开关SWV0,SWV1,SWV2和SWV3及总线h0,h1,h2和h3来转送数值。
当磁心单元中的内容要存入目标存贮器中时,可以使用目标存贮操作make和unify-id。
make指令
在make操作的第一步,有关寄存器中的内容被如图20所示但以相反的方向进行传送。该操作也能转送环境寄存器内容。为了找到存贮有与磁心单元提供的信息相同的信息,在目标存贮装置中执行一次关联搜索。如果找到目标,则返回表示该目标的标识符;反之,如果没有找到目标,则返回一个未用标识符。在这二种情况下,都使用总线连线id把标识符从目标存贮装置转送至磁心单元中的识别符寄存器。另外一种方法是把识别符转送到受到影响的那列寄存器中的主寄存器中。这样,在磁心单元中的内容与识别符之间就能建立起一种关联关系。
unify-id操作示于图21中,该操作通过开关SWid,SWid,ho,SWenv,ho,SWvo,SWV1,ho等把相关的寄存器单元与水平总线ho连接并把所有的垂直点线与水平点线ho相连,从而使一个寄存器(如S2,0)中的识别符分散到所有的垂直点线id,env,V0,V1,V2和V3上。在执行关联检索及替换时,比方说要找出一个识别符的出现场合并且要用一个新的被归纳了的简单值来替代找到的那个识别符时,就可以使用上述操作。
在与unify-id操作类似的操作中,在第一步可以使用make为磁心单元中的内容得到一个唯一的识别符,在第二步中把该磁心单元中的内容放到与目标装置相连的点线连线上,从而达到使用目标存贮装置存贮该识别符和它指定的内容的目的。
在附录1中给出了unify操作的一个例子,附录1中示出了磁心单元中的内容以及相位a、b和O的开关状态。
2.数值归纳
在进行数值归纳时,把要归纳的目标(即目的值)放置在主寄存器中。一般说来,整个目标都参加归纳。典型的情况下,主寄存器S0,0保存指令码,它对于不同的指令呈不同的比特格式。寄存器S1,0和S2,0用于进行双值运算(即需要二个操作数的运算)寄存器S1,0用于单值运算(即只有一个操作数的运算)。一般情况下,后面的寄存器用于列表形式,因此在一次归纳之后它们的内容即被推向左边。
然后,在目标寄存器S1,0和S2,0之间进行重要的数值运算。数值ALU的一个主加法器与这二个寄存器相连。其余的寄存器在象mul,div和mod等指令中用于补充目的。
可以使用下面的指令类型:
单值指令:寄存器S0,0保持指令。寄存器S1,0保持操作数。寄存器S2,0和S3,0未使用。数值ALU的结果返回到所有主存贮器中。在非流水线的情况下,它被存贮在寄存器S1,0中在流水线的情况,它将被立即存入辅助寄存器或基寄存器中。
双值指令:寄存器S0,0保持指令,而寄存器S1,0和S2,0保存操作数。寄存器S3,0未使用。结果返回到所有的主寄存器中。在非流水线的情况下它被存贮在S1,0中,在采用流水线的情况下,它将被立即存入辅助寄存器或基寄存器中。
nul,div,mod指令:寄存器S0,0保存指令,寄存器S1,0,S2,0保存操作数。寄存器S3,0可以用于暂时地存放中间结果。最终结果存入寄存器S1,0中。
unify指令:联合归纳时使用数值ALU比较寄存器S0,0中的内容与寄存器S1,0的内容。在执行联合时,也可以使用其他的主寄存器。寄存器的HEAD平面中存贮的特征字用来和比较结果一起用于计算下一个动作的值。
指令mul,div和mod完全在数值运算单元内执行它们的内环。计算到的中间值可以动态地存贮在磁心单元中数值运算单元和主寄存器之间的连线(即点线NU)上。
3.结构归纳
在进行结构归纳期间,待归纳的目标(即目的值)被放置在主寄存器中。一般情况下,基寄存器的一部分或全部将参加归纳。典型情况下,S0,0保持指令码,对于不同的指令就会有不同的位格式。
map指令具有一个函数f和作为变元的一个清单(el,……en)。给清单中的每个元素都使用该函数。该指令返回每个函数使用的结果的一个清单(fe1,…,fen),这里fe1表示把f应用于e1时的结果。
mapping指令
格式:(map f list)。
map指令装入辅助寄存器F0中,把要使用的函数装入辅助寄存器F1中。清单装入主寄存器S0,0至S3,0中。如图22a所示,存贮在主存贮器中的元素中的元素在底寄存器阵列中被向上转送二层,就是说把寄存器SX,0中的内容转送至SX,2寄存器中这里的X为0至3的一个数。这种转送是使垂直总线连线V0至V3来完成的。接下来,从图22b中可以看出,辅助寄存器F0和F1的内容被水平方向“广播”给其它基寄存器,即F0的内容拷贝至S0,0至S3,0,F1的内容拷贝至S0,1至S3,1。如果一个元素为简单值(不是清单),那么,该元素所在的那个寄存器单元(如S1,2)及它下方的寄存器单元(如S1,1)中的内容要向下移位一层。现在,要使用的函数位于主寄存器单元(如S1,0)中,即函数要施用作用的元素位于该主寄存器之上(如S1,1)中。如果元素为一个清单,则那一列寄存器中就不作移动。在图22C中,假定e1,e2和e3表示简单值,而e4表示插入清单。因此,基寄存器矩阵中的每一列都将作为一个闭包存入目标寄存装置中。然后,再把每一个这样存贮了的闭包装入磁心单元中进行继续处理。如果存贮的闭包包含一个简单值,则它将以正常方式即f存入S0,0中、ei存入S1,0中(如图22d所示)装入磁心单元中。另一方面,如果存贮的闭包包含有一个插入清单,它也象图22A那样被装入,只是e1为e4所表示的清单中的第一个元素,而e2则是e4中的第二个元素,等等。这将使mop指令循环地工作在这样插入清单上。
这样,具有二级结构的map指令
(map,f,(e1,…,en))
被改写成:
((f,el),,(f,en)),
在执行之后,它将被改写成一个一级结构,
(fe1,…,fen),
这里的fel表示把f应用于el的结果。
具有三级(或更多)结构的map指令
(map,f,par(el,…,(ek,…,em),…,en))
(这里(ek,…,em)为一插入清单)作为中间步骤被改写成:
par((f,el)…,(map,f,(ek,…,em))…,(f,en)),
再改写成:
par((f,el),…,((f,ek),…,(f,em)…,(f,en)),
在执行之后,它将被改写成一个二级结构:
par(fel,…,(fek,…,fem),…,fen),
这里的fel表示把f应用于el的结果,这里的(f,ek,…fem)为一个插入清单。
这样,函数f就将循环地应用于变元清单中的所有元素上。
下面将描述磁心单元怎么重建和执行一条map指令的示范例。为描述起来简短起见,我们用缩写reg表示寄存器,ident表示识别符,用storagel(存贮装置)在表示目标存贮装置。范例指令为:
(map f(-1 -2(-7 -8))),
这里f为定义为f(x)=abs(x)+1。采用机器识别符的机器表示可以是:
id1:(map f id2)
id2:(-1 -2 id3)
id3:(-7 -8)
这里的识别符id1表示含有(map f id2)结构的闭包。
下面,x为0至3中的一个数。执行下列的步骤:
第1步:map存入寄存器F0中,f存入寄存器P1中,识别符id2存入寄存器S0,0中,
第2步:使识种符id2展开,即寄存器S0,0包含-1,寄存器S1,0,包含-2,寄存器S2,0包含识别符id3,
第3步:把寄存器SX,0中的内容转送到寄存器SX,2中,标为未使用的寄存器不受影响。
第4步:使map和f水平方向上进行“广播”,即寄存器SXSX,1中包含f,寄存器SX,0中包含map。标为未使用的寄存器不受影响。
第5步:其寄存器SX,2中为一简单值的列被向下降一层,即S0,1中为-1,S0,0中为f,S1,1中为-2,S1,0中为f。第三列未触及。
第6步:把基寄存器矩阵中的每一列象下面那样(重新)存入目标存贮装置中:
id1:(id6 id7 id8)
id6:(f -1)
id7:(f -2)
id8:(map f id3)
第7步:把识识符id6指定的闭包装入主寄存器中,f装入S0,0中,-1装入S1,0中。
第8步:把函数比方说f(x)=abs(x)+1应用到变元上,得出结果2,该结果2又存贮在寄存器S0,0中。
第9步:在目标存贮装置中执行对识别符id6的关联检索,所有出现的识别符id6均被2所替代:
id1:(2 id7 id8)
id7:(f -2)
id8:(map f id3)
第10步:对于id7执行第7-9步,得到结果为3,目标存贮器中:
id1:(2 3 id8)
id8:(map f id3)
第11步:对于id8执行第1至第6步,结果使得底矩阵的两列存贮在目标存贮器中:
id1:(2 3 id8)
id8:(id9 id10)
id9:(f -7)
id10:(f -8)
第12步:对于id9和id10执行第7-9步,分别得到结果为8和9。存贮装置9。存贮装置中:
id1:(2 3 id8)
id8:(8 9)
它可以读作(2 3(8 9))一这样函数f被应用到了变元清单中的所有元素上。
应该注意的是,上述描述的步骤可以由磁心单元以一种不同的但更有效的方式来执行比方说,一旦时机适当,就可以对中间结果作进一步的归纳处理,而不是把它们存贮在目标存贮装置中。
transpose
格式:(transpose format)
把转送指令装入一个辅助寄存器(如F0)中,把清单变元(如清单中的清单)装入基寄存器矩阵中,见图23。基寄存器的内容被转送。这样,具有三级结构的transpose指令
(transpose,
((em,…,e1,m),
……
(en,1,…,en,m)))
被执行的结果是改写成一个二级结构:
((el,1,…,en,1),
……
(e1,m,…,en,m))
举一个示范性实例:
一个清单结构
((1 2 3 4),
(5 6 7 8),
(9 10 11 12),
(13 14 15 16)),其第一个清单即(1,2,3,4)存入基寄存器的第一列即基寄存器SD,0至SO,3中,第二个清单(5,6,7,8)存入第二列基寄存器即基寄存器S1,0至S1,3中,与此类推;
被转写成:
((1 5 9 13),
(2 6 10 14),
(3 7 11 15),
(4 8 12 16)),此刻,第一个清单(1 5 9 13)被存贮在第一列基寄存器(即基寄存器S0,0至S0,3中,与此类推。
swap
格式:(swap m list)
swap(互换)指令执行后,一个具有三级结构的swap指令
(swap m((e1,1,…),
…
(em,1,…,),
(em+1,1,…,),
……
(en,1,…)))
(这里是元素ei,j的清单的清单,i,j是一个元素在基寄存器矩阵中的位置标号)被改写成一个二级结构:
((e1,1,…),
…
(em+1,1,…),
(em,1,…),
……
(en,1,…))。
这里元素(em,1,…)与元素(em+1,1,…)互换了位置。
skip
格式:(skip m list)
skip指令执行之后,一个具有三级结构的skip指令
(skip m((e1,1,…),
……
(em-1,1,…)
(em,1,…)
(em+1,1,…)
……
(en,1,…)))
(这里是元素ei,j的清单的清单,i和j是一个元素在基寄存器矩阵中的位置标号)被改写成:
((e1,1,…),
…
(em=1,1,…),
(em+1,1,…),
…
(en,1,…))
这里的元素(em,1,…)已被删除。
4.清单指数
把一个包含清单的目标放在主寄存器中。如果清单中包含属于插入清单的元素,这些清单被垂直地存贮在子寄存器中。
expard-list操作可以在一个周期内执行,基寄存器中的内容都被在对角线上向右下移动一步,只有主寄存器中的内容除外,它们被转送至垂直点线,插入到该列的最上方的基寄存器中(见图24)。可以重复使用expand-list,从而给许多主寄存器单元“填充”数据。
虽然上面描述的这些磁心单元和寄存器单元的设计构成了本发明的最佳实施例,应该理解的是,本发明并不局限于这些特定的设计,不必离开本发明的范围就能对它们作出许多改进。
图25中示出了磁心单元的另一个实施例。对于与图7相同的磁心单元元素,我们使用了与图7中相同的参考符号。具有与图7不同的连接的元素我们标上了11符号。图7中的最佳实施例与图25中的实施例的差别在于基寄存器S″0,0,S″1,0,S″2,0和S″3,0可以与一根没有开关的连线res″相连。。另外还省略了点线连线Cid和Cfo,而且基寄存器的W(西)端口并不与基寄存器S3,y的E(东)端口相连(y为0至3间的一个数),而是这些端口上接有一个f(假)信号。磁心单元内部对于某些指令的连接通道也可以稍微有些不同,但这不是功能上的差别,而是在磁心寄存器单元内部控制那些内部开关的差别。图中的寄存器之间的连线也稍有不同,但是这也只是一个控制每个寄存器单元内部的哪那内部开关的问题。
图26中示出了磁心寄存器单元的第二个实施例,这个实施例旨在给出这样的事实:即一个单元中的受控制的开关可以以不同的方式设置,同时,该单元仍具有同样的功能。对于相同的部分使用了与图8中相同的参考符号。具有与图8中的连接不同的连接情况的部分被标上了11符号。图8和图26中所示的实施例之间的主要区别在于于:在图26中省略了端口C和开关SWC,端口V和H各自只有一个开关,采用了带开关的端口L,L′和D而没有使用带开关的端口Da和Db。
虽然我们在上面是结合具体实施例描述本发明的,但是当该理解的是,本技术领域内的熟练人员在不离开本发明的精神范围就可以作出许多改变,找出各个部分的等效物。此外,不离开本发明的基本示教还可以对本发明作出改进。