aboutsummaryrefslogtreecommitdiffstats
path: root/schedcat/model/resources.py
blob: 4d677df2d97a56a83286fdd49fdbc8e2d1a73f52 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54


class ResourceRequirement(object):
    def __init__(self, res_id, num_writes=1, write_length=1,
                 num_reads=0, read_length=0):
        self.res_id           = res_id
        self.max_writes       = num_writes
        self.max_reads        = num_reads
        self.max_write_length = write_length
        self.max_read_length  = read_length

    @property
    def max_requests(self):
        "Number of requests of any kind."
        return self.max_writes + self.max_reads

    @property
    def max_length(self):
        "Maximum request length (of any kind)."
        return max(self.max_write_length, self.max_read_length)

    def add_request(self, length, read=False):
        "Increase requirements."
        if read:
            self.max_reads += 1
            self.max_read_length = max(self.max_read_length, length)
        else:
            self.max_writes += 1
            self.max_write_length = max(self.max_write_length, length)


    def add_read_request(self, length):
        self.add_request(length, True)

    def add_write_request(self, length):
        self.add_request(length, False)

    def convert_reads_to_writes(self):
        self.max_writes = self.max_requests
        self.max_write_length = self.max_length
        self.max_reads = 0
        self.max_read_length = 0


class ResourceRequirements(dict):
    def __missing__(self, key):
        self[key] = ResourceRequirement(key, 0, 0, 0, 0)
        return self[key]


def initialize_resource_model(taskset):
    for t in taskset:
        # mapping of res_id to ResourceRequirement object
        t.resmodel   = ResourceRequirements()