"""W03: schematic address translation and a direct-mapped cache, not hardware timing."""deftranslate(address,page_map,page_size=4096):iftype(address)isnotintoraddress<0ortype(page_size)isnotintorpage_size<=0:raiseValueError("nonnegative address and positive page size required")ifany(type(x)isnotintorx<0forpairinpage_map.items()forxinpair):raiseValueError("page numbers must be nonnegative integers")page,offset=divmod(address,page_size)ifpagenotinpage_map:raiseKeyError("unmapped virtual page")returnpage_map[page]*page_size+offsetdefdirect_mapped(addresses,line_size=32,lines=2):ifany(type(x)isnotintorx<=0forxin(line_size,lines))orlines>65536:raiseValueError("bounded positive cache dimensions required")tags=[None]*linesresult=[]foraddressinaddresses:iftype(address)isnotintoraddress<0:raiseValueError("invalid address")block=address//line_sizeindex=block%linestag=block//lineshit=tags[index]==tagtags[index]=tagresult.append({'address':address,'line':index,'tag':tag,'hit':hit})returnresultif__name__=='__main__':print(translate(0x2345,{2:7}))print(direct_mapped([0,64,0,64]))