[24] MIPS Improved Division Circuit - MIPS ALU Design

Mostafa Abdelrehim, PhD
1 Jul 202215:58

Summary

TLDRفي هذا الدرس، نتابع مناقشة الدوائر الحسابية للتقسيم، مع تحسينات تتضمن دمج القاسم في السجل المتبقي، مما يؤدي إلى تقليل حجم السجل إلى 32 بت بدلاً من 64 بت. نشرح الخطوات الآلية والعمليات الحسابية التي تتضمن التحويل والتحقق من القيمة الصحيحة أو السالبة، مع مثالاً لعملية التقسيم. نناقش أيضًا التعليمات التي تقوم بعملية التقسيم في MIPS، مع التعامل مع القيمة الصحيحة والغير صالحة للأرقام، وكيفية التعرف على العلامة السلبية للنتيجة.

Takeaways

  • 😀 المحاضرة تناقش الدوائر التقسيمية وتحسيناتها.
  • 🔄 في الدوائر التقليدية، يستخدم سجل الباقي 64 بتًا، لكن النصف الأيسر دائمًا فارغ.
  • 🆕 تم تصميم الدوائر المحسنة لدمج سجل الباقي وسجل الناتج في سجل واحد 64 بتًا.
  • 📉 تم تقليل حجم مقسم الدوائر المحسنة إلى 32 بتًا.
  • 🔢 في الدوائر المحسنة، سجل الباقي يحتوي على الباقي والناتج في النصف اليمين واليسار، على التوالي.
  • 🔄 عند استخدام الدوائر المحسنة، يتم تحويل القيمة المراد قسمها (الدائن) بطريقة تتضمن تنقيط اليمين.
  • ➗ في الخوارزمية، يتم تقسيم الدائن على المقسم بخطوات، مع التحقق من القيمة الفعلية للباقي بعد كل خطوة.
  • ✅ عند التحقق أن الباقي سلبي، يتم استعادة القيمة الأصلية للجزء اليسرى من سجل الباقي.
  • 🔄 في النهاية، يتم تنقيط النصف اليسرى من سجل الباقي للوصول إلى الناتج النهائي.
  • 🛑 الدوائر المحسنة لا يمكن تحويلها لعمليات أسرع مثل الدوائر الضربية، بسبب الخطوات التي تتضمن التحقق من القيمة الفعلية للباقي.
  • 💡 في MIPS، يمكن استخدام أوامر خاصة لإجراء العمليات الحسابية للتقسيم، مع استخدام سجلات high و low للوصول إلى الباقي والناتج.

Q & A

  • ما هو الهدف الرئيسي من تحسين دائرة القسمة التي تم شرحها في المحاضرة؟

    -الهدف الرئيسي هو دمج سجل الحاصل مع سجل الباقي لتقليل حجم الدائرة وتحسين أدائها.

  • لماذا يتم دمج سجل الحاصل مع سجل الباقي في الدائرة المحسنة؟

    -لأن نصف السجل الذي كان يُستخدم للباقي كان يحتوي على أصفار دائمًا، ودمج السجلين يوفر مساحة ويحسن الكفاءة.

  • ما هو حجم سجل الباقي في الدائرة المحسنة؟

    -سجل الباقي في الدائرة المحسنة يكون حجمه 64 بت.

  • كيف يتم تقسيم سجل الباقي بعد التحسين؟

    -النصف الأيسر من سجل الباقي يحتوي على الباقي، بينما النصف الأيمن يحتوي على الحاصل في نهاية العملية.

  • ما حجم القاسم في الدائرة المحسنة؟

    -حجم القاسم في الدائرة المحسنة هو 32 بت.

  • ماذا يحدث للقاسم أثناء العملية في الدائرة المحسنة؟

    -يتم تقسيم القاسم إلى 32 بت، ويتم الاستغناء عن الـ 64 بت المستخدمة سابقًا.

  • ما هي خطوات العملية في الدائرة المحسنة؟

    -تشمل الخطوات نقل سجل الباقي لليسار بمقدار بت واحد، وطرح القاسم من النصف الأيسر لسجل الباقي، ثم اختبار إذا كانت النتيجة موجبة أو سالبة، واتخاذ الإجراء المناسب بناءً على ذلك.

  • كيف يتم التعامل مع النتيجة السالبة في الدائرة المحسنة؟

    -إذا كانت النتيجة سالبة، يتم استعادة القيمة الأصلية للنصف الأيسر من سجل الباقي، ثم نقل السجل لليسار وإضافة صفر في النهاية اليمنى.

  • ما هو الفرق بين الدائرة المحسنة والدائرة الأصلية من حيث عدد التكرارات؟

    -الدائرة المحسنة تتكرر 32 مرة إذا كانت MIPS Register، بينما الدائرة الأصلية كانت تتكرر N+1 مرة.

  • كيف يتم تحديد إشارة النتيجة النهائية في التعليمات المستخدمة للقسمة في MIPS؟

    -يتم تحديد إشارة النتيجة بناءً على إشارات القيم المدخلة، فإذا كانت القيم المدخلة لها نفس الإشارة تكون النتيجة موجبة، وإذا كانت مختلفة تكون النتيجة سالبة.

Outlines

00:00

😀 Introduction to Improved Division Circuits

The lecturer begins by welcoming the audience back and introducing the topic of division circuits. They explain that while the previously discussed circuit functioned, there were inefficiencies that could be improved upon. The main issue was that the 64-bit remainder register was not fully utilized, with the left half often being zeros. The solution proposed is to combine the quotient into the remainder register, effectively making it a 64-bit register that holds both the quotient and the remainder, with the left half for the remainder and the right half for the quotient. The divisor is also reduced to 32 bits, and the process involves shifting and combining operations to optimize the circuit's performance.

05:02

🔄 Detailed Explanation of Division Circuit Algorithm

This paragraph delves into the step-by-step algorithm of the improved division circuit. The process starts with shifting the remainder register to the left and then iterating through subtraction and addition with two's complement where necessary. The讲师 explains how to handle negative remainders by restoring the original value and adjusting the remainder register accordingly. The summary includes the iterative process of subtraction, addition of two's complement, and the significance of checking the most significant bit to determine if the remainder is positive or negative. Each iteration is described in detail, showcasing the shift and conditional operations involved in the division process.

10:04

🔢 Final Steps and Conclusion of Division Circuit Operation

The final paragraph discusses the concluding steps of the division circuit operation. After several iterations, the讲师 explains the process of shifting the left half of the remainder register to the right to finalize the quotient and remainder. The讲师 clarifies any confusion regarding the shifting process and emphasizes the importance of the remainder register containing both the quotient and the remainder. The讲师 also touches on the limitations of speeding up the division process, unlike multiplication, due to the need to check the sign bit after each subtraction. The paragraph concludes with a brief mention of faster dividers that use SRT division for efficiency.

15:04

📘 MIPS Division Instructions and Sign Considerations

In the last paragraph, the讲师 shifts focus to the implementation of division in MIPS architecture. They explain the use of high and low registers to store the remainder and quotient, respectively. The讲师 outlines the two types of division instructions for signed and unsigned integers and simplifies the process of determining the sign of the result based on the input signs. The讲师 also mentions the absence of overflow in division and the use of move high and move low instructions to access the values in the high and low registers. The video concludes with a thank you to the viewers and an invitation to the next video.

Mindmap

Keywords

💡مقسم

المقسم هو الرقم الذي يُستخدم في العملية الحسابية للتقسيم، ويتم استكشاف في النص كيف يمكن تحسين كircuits التقسيم لتقليل حجم المقسم والتقليل من عدد العمليات. في النص، يُذكر أن المقسم في كircuits التقسيم قد يكون 64 بت ولكن يُقترح تقليل حجمه إلى 32 بت.

💡سجل الباقي

سجل الباقي هو جزء من كircuits التقسيم ويحتوي على القيمة التي تبقى بعد التقسيم. في النص يُناقش كيف يمكن تحسين كircuits التقسيم من خلال دمج سجل الباقي مع سجل الاقتباس لتحسين الأداء.

💡سجل الاقتباس

سجل الاقتباس هو السجل الذي يحتوي على النتيجة النهائية من العملية الحسابية للتقسيم. في النص يُناقش كيف يمكن دمج سجل الاقتباس مع سجل الباقي لتحسين كircuits التقسيم.

💡التقسيم الحسابي

التقسيم الحسابي هو العملية التي تتضمن تقسيم رقم على آخر. في النص يُناقش الخطوات التي تتم خلال كircuits التقسيم، مثل تحويل الباقي إلى إقتباس وتحويل المقسوم إلى مقسوم.

💡تحويل اثنين

تحويل اثنين هو العملية التي تُستخدم لتحويل رقم من شكل عكس اثنين إلى شكل عادي، وهي مفيدة في كircuits التقسيم لعمليات الطرح. في النص يُستخدم مثال التقسيم 6 / 2 لتوضيح العملية.

💡التحول الصحيح

التحول الصحيح هو عملية نقل البيانات من مكان إلى آخر، وفي النص يُستخدم للشرح كيف تُغير قيمة سجل الباقي في كircuits التقسيم.

💡التحقق الرقمي

التحقق الرقمي هو الخطوة التي تُستخدم لمعرفة ما إذا كانت القيمة الناتجة من العملية الحسابية موجبة أم سالبة. في النص يُستخدم للتحقق إذا كان الباقي سالب قبل التحويل إلى إقتباس.

💡الرمز ال Dungs

الرمز ال Dungs هو الطريقة التي يُستخدمها الكمبيوتر لتمثيل الأرقام السالبة. في النص يُناقش كيف يُستخدم في كircuits التقسيم لعمليات الطرح والتحقق.

💡معالج العمليات الحسابية MIPS

MIPS هو معالج العمليات الحسابية الذي يُستخدم في البرمجيات لمعالجة العمليات الحسابية. في النص يُناقش كيفية استخدام كircuits التقسيم مع معالج MIPS.

💡تعليمات التقسيم

تعليمات التقسيم هي الأوامر التي تُستخدم لتنفيذ العمليات الحسابية للتقسيم في معالج العمليات الحسابية. في النص يُناقش كيفية تنفيذ التقسيم في معالج MIPS باستخدام سجل الأعلى وسجل الأدنى.

💡التجاوز

التجاوز هو الحالة التي تحدث عندما لا يمكن لقيمة معينة أن تُمثل في عدد بит معين. في النص يُذكر أن التجاوز لا يُحدث في كircuits التقسيم لأن القيمة الناتجة دائمًا أقل من القيمة الإدخالة.

Highlights

Introduction to division circuits and hardware, exploring improvements over previous designs.

Discussion on the inefficiency of using a 64-bit remainder register when only the left half is utilized.

Proposing an improved division circuit that combines the quotient into the remainder register, reducing the register size to 32 bits.

Explanation of how the left half of the new register will be the remainder and the right half the quotient.

Introduction of a 32-bit divisor, halving the size of the divisor from previous designs.

Description of the initial setup where the remainder register is initialized with the dividend.

Illustration of the division process using an example of dividing six by two, highlighting the shift operations involved.

Introduction of the improved circuit with a single 64-bit register for quotient and remainder, and a 32-bit divisor.

Algorithm explanation for the improved division circuit, detailing the steps for dividing seven by two.

Step-by-step demonstration of the division algorithm, including shifting and subtraction operations.

Discussion on the handling of negative remainders and the process of restoring the original value.

Explanation of the iterative process and how it differs from the continuous operation of the original circuit.

Final result of the division example, showing the quotient and remainder in the remainder register.

Comparison of the improved division circuit with the original in terms of hardware consumption and speed.

Introduction to faster division methods like SRT division, which predicts the sign of the remainder.

Discussion on the simplicity of determining the sign of the division result in MIPS and the absence of overflow issues.

Explanation of how to use high and low registers in MIPS for division instructions and accessing their values.

Conclusion and summary of the division circuit improvements and their implications in hardware design.

Transcripts

play00:00

hello guys welcome back to our lectures

play00:01

in this lecture we're going to continue

play00:03

to talk about division circuits division

play00:05

hardware

play00:06

so basically this is you know the

play00:08

circuit that we explored the last time

play00:14

it was you know doing the job

play00:16

but there are some remarks and this

play00:18

remarks about the operation of the

play00:20

operation of this circuit will it will

play00:22

lead us to the improved version of the

play00:24

division circuit

play00:25

so

play00:27

the remainder register was 64 bits and

play00:30

all the time whenever you use this

play00:32

circuit you're gonna end up with

play00:35

the left half of that register all zeros

play00:39

and the divisor circuit will be is also

play00:42

64 bit because we do shift right and

play00:45

again the left half of this will be all

play00:48

zeros all the time

play00:50

i mean they are not used

play00:53

and we should have a quotient register

play00:56

of 32-bit to hold the is the question

play00:59

for us

play01:00

so the main idea or the main motivation

play01:02

is basically to combine

play01:04

the quotient into

play01:07

the remainder register

play01:09

so it now shouldn't be called the

play01:11

remainder anymore although they call it

play01:12

remainder because now this register this

play01:15

64 register will contain the quotient

play01:19

and is a remainder at the same time

play01:21

so the left half will be the remainder

play01:24

the right half at the end of the

play01:25

operation will be the quotient right as

play01:28

we're going to see in the improved

play01:29

circuit

play01:34

the divisor will be

play01:36

32 bits so we're going to cut it in half

play01:43

and we're going to initialize the

play01:45

remainder register with the dividend and

play01:47

it's dividend 32 bits so now

play01:50

this

play01:51

other circuit takes the 32 bits from the

play01:54

remainder register which is the part is

play01:56

in which the the dividend is located and

play01:59

now is a divisor 32 bits so we don't

play02:02

need 64 bit either we need only 32 bits

play02:05

so

play02:06

if we do this if we design it correctly

play02:08

we're going to discard as a quotient

play02:10

register because we're going to combine

play02:11

it in the remainder register

play02:14

the remainder register will continue at

play02:15

the end our remainder and our quotient

play02:17

all in the same place

play02:19

and the divisor will be 32 bits

play02:22

the other will be 32 bits

play02:26

but we should know that anything of

play02:29

shifting right is a

play02:31

the divisor as we do

play02:33

previously we're gonna shift left

play02:37

as a remainder

play02:39

let's let's have an insight about this

play02:41

so when we do for example six divided by

play02:43

two

play02:48

we start like this does one zero goes

play02:50

into one we said no

play02:52

then we said does one zero goes into one

play02:54

one we said yes

play02:56

this is basically a shift operation so

play02:58

here is the six

play03:00

and here is the two

play03:02

it doesn't work like this so we're gonna

play03:04

shift it so it become like this so yes

play03:07

one zero goes into one one

play03:11

and this is shift

play03:13

right

play03:15

but we can do exactly the same if we

play03:18

shift the lift the dividend so let's

play03:20

write it again like this here is one

play03:22

zero we're gonna shift

play03:24

lift the dividend so it becomes

play03:26

like this

play03:28

and yes one zero guys can go into one

play03:31

one

play03:32

okay

play03:33

so that's basically a highlight of what

play03:35

we should do in order to have a better

play03:38

circuit here is the better circuit where

play03:39

is the improved circuit

play03:42

one 64 register that called the quotient

play03:45

and the remainder at the same time

play03:49

the divisor is 32 bits

play03:51

in the beginning

play03:54

the remainder register will have

play03:56

part zero

play04:00

the bar two is a dividend

play04:03

this part is 32 bits so we have here 32

play04:05

bits 32 bits so that the arithmetic

play04:08

operation is the other is only 32 bit

play04:11

other

play04:12

so we we we decreased the half of its

play04:14

size which is good

play04:17

now let's see an example of how this

play04:18

works

play04:22

here is the algorithm

play04:24

of that

play04:26

circuit here is a dividend

play04:30

in this case seven so we're gonna divide

play04:32

the seven by two

play04:34

here is the divisor two which should

play04:36

give us a quotient

play04:38

of three and a reminder remainder of one

play04:43

so let's go step by step with this

play04:46

you know uh algorithm this algorithm

play04:48

will repeat for four times in that case

play04:50

because we are dealing with four bits if

play04:51

it's a mips register it will be 32 times

play04:53

so it's different from you know the is

play04:56

the original circuit which is

play04:58

continuous for n plus one times

play05:01

so we should stop iterating after after

play05:03

the fourth iteration

play05:07

so the first system is to shift the

play05:09

remainder register left by one bit

play05:12

so it will become like this

play05:17

then we go into the iteration

play05:24

we subtract the divisor register from

play05:26

the left half of the remainder register

play05:29

here is the left half of the remainder

play05:31

register

play05:34

and here is the divisor

play05:36

of course again we don't do subtraction

play05:38

but we do the addition with the two's

play05:40

complement so what is the twos

play05:41

complement of

play05:43

this value zero zero one zero

play05:46

we convert it

play05:47

then we add one one plus one is zero

play05:50

we have a carry of one one plus one is

play05:52

one plus zero is one is in one one

play05:55

so basically we're gonna add zero zero

play05:57

zero zero with one one one zero

play06:00

which will give us one one one

play06:04

zero so the left half here will be one

play06:07

one one zero

play06:09

and the right half will be the same

play06:13

then we test this arima as a remainder

play06:18

for the left is most significant if it's

play06:20

a zero or or if it's positive or

play06:22

negative

play06:23

so to do this we check the most

play06:25

significant bit which is one in that

play06:26

case and we know that if it's one

play06:29

so it's then it's uh it's a negative

play06:31

like for example here's the complement

play06:34

you see it's it's it's a negative here

play06:36

so it's one here

play06:39

so if it's uh less than zero if it's a

play06:41

negative we do

play06:43

that box here that box contains two

play06:46

steps the first step is to restore

play06:50

the original value of the device of the

play06:53

left half of course because the right

play06:54

half doesn't change

play06:56

so it should go back to its original

play06:58

value which is 0 0 0

play07:00

0 1 1 1 0.

play07:07

and then we also shift the remainder

play07:09

register to the left

play07:11

setting its right most bit or the least

play07:14

significant bit to zero

play07:16

so second step

play07:19

will make

play07:20

this register looks like this

play07:27

okay so this value here will be in that

play07:31

place

play07:33

so it's two step in one in one in in one

play07:36

step

play07:38

so here is the subtraction

play07:40

and here is you know the branch after

play07:42

the check

play07:44

that's one iteration

play07:46

so this is iteration one

play07:49

we still less than four so we're gonna

play07:51

go back

play07:54

again subtract the divisor from

play07:57

you know left half of the remainder

play07:59

here is the left half of the remainder

play08:03

here is a divisor

play08:05

but here is that

play08:06

the two's complement of the device

play08:08

you don't need to do it again you're

play08:10

going to use it all the time and we're

play08:12

gonna add

play08:13

one plus zero is one

play08:16

so

play08:17

that's basically the new

play08:20

remainder register

play08:22

we check the remainder if it's positive

play08:23

or negative it's a negative because the

play08:24

most significant bit is one

play08:27

that mean we should restore

play08:29

we should lift the shift left and about

play08:32

zero

play08:33

restores that means we're gonna get back

play08:35

the same value which is zero zero zero

play08:37

one one one zero zero then we shift uh

play08:41

left so we're going to add up

play08:44

another zero here

play08:46

so that's will be the values that we're

play08:48

gonna

play08:52

use and that is the second iteration

play08:59

still we are not four so we go back we

play09:01

subtract

play09:02

so zero zero one one we're gonna add up

play09:06

to one one one zero one plus zero is one

play09:09

one plus one is zero we have a carry of

play09:11

one

play09:12

one uh zero we have a carry of one zero

play09:14

we have a carrier one this will be

play09:15

discarded and that's the new

play09:18

left half of the remainder register

play09:22

we tested the remainder now it's the

play09:23

positive so it's most of so we go in

play09:26

that direction

play09:28

to do that

play09:29

what's it gonna do

play09:30

we will not restore

play09:33

okay we're gonna keep the value of the

play09:34

remainder as it is but

play09:36

we're gonna

play09:38

shift the remainder now

play09:40

to the left but setting the right the

play09:42

most bit to one

play09:44

so we're gonna have something like this

play09:49

that's the third iteration

play09:52

we still need four so we go back

play09:55

subtract divisor from the you know left

play09:57

half of the remainder

play09:59

0 0 1 1 plus 1 1

play10:03

that was complement of the divisor one

play10:05

plus zero is one one plus one is zero we

play10:08

have a carry of one one plus one zero we

play10:10

have a carry of one one plus one zero we

play10:12

have a carry of one

play10:13

that's the new

play10:18

remainder

play10:20

we check the remainder the remainder is

play10:22

positive we go in that location here

play10:25

we shift the left

play10:27

the remainder and the boot one so this

play10:29

will be one one

play10:34

and that's the fourth iteration and the

play10:36

last one

play10:37

so we should go out now and do this step

play10:40

this is the system is not done

play10:43

we should do something here we should

play10:45

shift the left

play10:47

we should shift left half of the

play10:50

remainder right

play10:51

one bit

play10:53

i know it's confusing so

play10:55

we're gonna shift the left let's write

play10:57

it in that way shift the left

play11:01

who is going to be shifty lifted

play11:03

the right half

play11:10

i'm sorry we should i'm sorry we should

play11:14

shift

play11:16

right

play11:20

the left half

play11:23

of

play11:24

the remainder so shift right i'm gonna

play11:27

write it here

play11:28

shift right

play11:30

the uh

play11:33

left half

play11:35

of the remainder so

play11:37

this part this right half will stay the

play11:39

same

play11:40

but this will be shift uh right so shift

play11:44

right means that direction so that means

play11:46

it will be zero zero zero one

play11:51

and we're done there

play11:52

so and we know that the remainder

play11:54

register should contain both the

play11:56

question and the remainder yes

play11:58

this is the quotient

play12:01

the right half

play12:02

and the left half is the remainder and

play12:06

we know we were expecting one in the

play12:08

remainder that's correct we were

play12:10

expecting three in the remainder that's

play12:13

also correct

play12:16

it is guys all the you know the in more

play12:19

details

play12:20

you know but in the form of a table

play12:22

that's exactly the same solution that we

play12:24

just did

play12:25

using you know is a bin

play12:28

but you know just to type it here with

play12:30

more details about what happens in each

play12:33

step

play12:34

if you are confused of the use of you

play12:36

know the marker

play12:40

after we did the is a division they

play12:43

improved division circuit in the

play12:44

multiplication lectures

play12:47

we

play12:48

showed that we can do

play12:50

you know

play12:51

we can exhibit we can consume more

play12:53

hardware and do faster the faster

play12:56

multiplication

play12:57

okay

play12:58

but

play12:59

unfortunately this is not the case here

play13:01

we cannot do this this with with the

play13:04

division and the problem is basically

play13:07

lies

play13:09

in that part here

play13:11

okay

play13:12

because

play13:13

if the the if the remainder was less

play13:16

than zero we should undo

play13:19

the value of you know uh

play13:22

remainder should restore the original

play13:24

value before the subtraction that's the

play13:27

problem so we can to do faster we should

play13:29

we should do step and wait until we

play13:32

check the

play13:33

is the sign sign bit we check if it's

play13:36

multiple negative

play13:38

fortunately there are some faster

play13:40

dividers that use some sort of division

play13:42

called srt division

play13:44

in which it predicts basically the sign

play13:47

is the sign is the same value

play13:50

you know off is a remainder

play13:54

but still it's not so

play13:57

fast like

play13:58

what we did with the multiplication

play14:01

finally how to do uh division the

play14:04

instructions that do the division in

play14:06

mips

play14:08

uh first of all we still gonna use the

play14:11

high and low registers like just like

play14:13

the the multiplication but now the high

play14:16

register will contain the remainder and

play14:18

the low register will contain the

play14:20

quotient

play14:22

we have two instructions

play14:24

that have an instruction for signed

play14:26

integers

play14:27

and if unsigned for unsigned integers

play14:31

luckily for the division here

play14:34

it's really simple to detect what will

play14:37

be the sign of the result basically if

play14:40

if both are positive the output will be

play14:42

positive if both are negative the output

play14:44

would be positive

play14:45

but if it's like xor if they have

play14:49

different

play14:50

signs in the output would be negative

play14:52

so

play14:53

like a divided by two this is positive

play14:56

four

play14:58

minus 8 divided by minus 2 this is also

play15:00

goes to 4

play15:02

so

play15:03

minus 8 divided by 2 is minus 4

play15:06

and a divided by -2 is basically minus

play15:09

4. so if they have the same

play15:12

sign

play15:13

they are to be positive if they have

play15:15

different signs it would be negative

play15:18

so it's easy to do here

play15:21

and also we don't have overflow

play15:24

that's also very good

play15:27

because we know that which would be all

play15:29

the time less than the input like for er

play15:32

you know

play15:33

at least the maximum the input

play15:37

and to use the high and low register

play15:39

values we use again

play15:42

move high byte and move low

play15:45

move high and move low

play15:47

in instructions to access this high and

play15:49

low registers

play15:51

that's it guys for the division thank

play15:53

you very much for watching and see you

play15:55

in the next video bye

Rate This

5.0 / 5 (0 votes)

الوسوم ذات الصلة
تدوينكروت العملياتالتقسيمالتحسينالبرمجةالهندسة الإلكترونيةالخوارزمياتالعمليات الحسابيةدورة علميةتعليمي