关于overflow,ALU

有两道题不会,图片1-2为question1,3-5为question2
question1

img

img

question2

img

img

img

##1

def and_gate_32(a,b,c):
    return tuple([int(v) & int(b[i]) & int(c[i]) for i,v in enumerate(a)])

def add_sub_overflow32(a,b,control):
    r1,r2=addsub32(a,b,control)
    a = a.zfill(32)
    b = b.zfill(32)
    if control==1:
        r3=1 if r1[0]!=a[0] else 0
    else:
        r3=1 if a[0]!=r1[0] and b[0]!=r1[0] else 0
    return r1,r2,r3

##2
def alu(a,b,c1,c0):
    if len(a)>32 or len(b)>32 or c1 not in [0,1] or c0 not in [0,1]:
        return "input error"
    a=''.join().zfill(32)
    b=''.join().zfill(32)
    if c1==0 and c0==0:
        res=or_32bit(a,b)
        r1=1 if ''.join(res)=='0'.zfill(32) else 0
        r2=1 if res[0]==1 else 0
        return r1,r2,0,0
    elif c1==0 and c0==1:
        res=and_32bit(a,b)
        r1=1 if ''.join(res)=='0'.zfill(32) else 0
        r2=1 if res[0]==1 else 0
        return r1,r2,0,0
    elif c1==1 and c0==0:
        res,r3,r4=add_sub_overflow32(a,b,0)
        r1=1 if res=='0'.zfill(32) else 0
        r2=1 if res[0]==1 else 0
        return r1,r2,r3,r4
    elif c1==1 and c0==1:
        res,r3,r4=add_sub_overflow32(a,b,1)
        r1=1 if res=='0'.zfill(32) else 0
        r2=1 if res[0]==1 else 0
        return r1,r2,r3,r4
    else:
        return "input error"

为了方便大家给你提供帮助,将图片中的汉化了,详情如下:

1翻译:
另一个ALU组件过低。如果输出太大,我们得到进位值。这将更改最重要的位。在两个补充中,这将
返回具有不同符号值的输出。
您需要一个溢出输出(1或O),它告诉您输入和操作的大小已导致溢出。我们只需要做加法。
溢出需要OR门。或门的输入是两个3输入与门的输出。这些与门的输入是以下各项的组合
两个32位输入和32位结果。请参见下图以了解详细信息。

图二翻译:
练习9:负输出、零输出和最终ALU
您必须考虑输出,以指示结果是负还是零。
为负结果创建输出很容易:如果最高有效位为1,则结果为负。
如果结果为零,则结果中的每一位都必须为零。
您可以检查结果是否为零,方法是先通过32OR门,然后通过1位NOT门。
只有当所有位都是O时,或门才输出0,否则输出1。
然后NOT门只切换输入。因此,在NOT门结束时,如果结果为零,则零输出为1,否则为O。
通过检查结果的每一位,您可以通过32位或门输入结果,如果其中一位为零,则或门的结果为1。
因此,最终ALU将有3个主要单元:32AND、32位OR和带控制线的32位加法器。
它还应该有溢出、进位、负和零的输出。
但在3个主要单元中,您需要能够选择要执行的操作。这是基于控制线的输入。
如果控制线为(0,0),则结果应为AND运算。
如果控制线为(0,1),则结果应为OR运算。如果控制线为(1,0),则结果应为加法运算。
如果控制线是(11),结果应该是减法运算。
所有这些都可以使用多路复用器来实现。
最终ALU将如下所示:

图三翻译:
您在上述单元格中编写的代码具有所有正确的功能—现在需要将它们拼凑在一起。
使用迄今为止创建的函数实现最终ALU函数,该函数采用4个参数、2个输入和2个控制信号,以及
返回一个元组,结果为元组格式,零位、负位、溢出低位和进位位。您的代码应该包括详尽的
测试并适当处理无效输入
#您应该将上述代码中函数的最终版本复制到此单元格中:#
#您应该能够将此单元格复制到python.py文件中,并在空闲状态下运行它。这将允许您将其导入为
定义值(a、b、c1、co):
“”此ALU接受四个参数。a和具有最大值的裸二进制数
在32个元素(列表或元组)中,c1和co是控制位。
对于按位AND、按位OR、加法和减法,输入00、01、10、11
分别用于cl和co的值。
函数应按以下顺序返回结果:零输出、负输出、溢出输出和进位
#此处是您的代码
#这里是详尽的测试代码-应该到达代码的所有分支-确保选择合适的v
#由于这是一个详尽的测试代码,您应该多次调用alu函数,